首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 调用EXE的导出函数 [已结贴,结贴人:zxjrainbow]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zxjrainbow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-21 12:52:55 楼主
      exedll.exe的代码
    在主程序的地方加入:
    C/C++ code
    extern "C" __declspec(dllexport) void showme(void) { MessageBox(NULL,"function print executed","ddd",MB_OK); }
       
      编译为exedll.EXE 
     
      然后:
    在其他EXE中这样调用:
    C/C++ code
    typedef void(__stdcall *showme)(void); HINSTANCE DLLhInstance; DLLhInstance=LoadLibrary("docbook.exe"); if(!DLLhInstance) { return -1; } showme pshowme =(AddNewTitle)GetProcAddress(DLLhInstance,"showme"); if(pshowme ) { pshowme(); } FreeLibrary(DLLhInstance);

    一调用就出错。存取地址错误。
    哪位高人来帮忙一下?
    我已经把base address 设置为0x400000000了。
    我是在CB2007下测试的。
    谢谢。
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zxjrainbow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 12:54:091楼 得分:0
    DLLhInstance=LoadLibrary("docbook.exe");
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zxjrainbow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 12:54:332楼 得分:0
    .。。。竟然又写错。。
    应该是:
    DLLhInstance=LoadLibrary("exedll.exe");
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • keiy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      7

      5

    发表于:2008-08-21 14:40:523楼 得分:0
    经测试,在调用exe的导出函数时,不能用系统动态函数(如MessageBox等)
    如果只是自己的程序,是没问题的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jacknes009
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 16:38:184楼 得分:0

    DLLhInstance=LoadLibrary("exedll.exe");
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zxjrainbow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:27:255楼 得分:0
    Keiy,你测试可以?
    可是我直接返回,不调messagebox都会出错啊?
    你能给个代码看看不?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jxw1987628
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-08-21 18:38:226楼 得分:20
    好像行不通吧。。LoadLibrary加载库文件还可以。。

    加载exe,我测试了,句柄HINSTANCE好像能得到。但当获取函数地址时访问到非法内存。。

    我怀疑是不是exe文件内部结构和dll,lib文件结构不一样,导致函数地址定位错误!

    至少我在6.0中测试是行不通的!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jdifjoifj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 08:43:247楼 得分:0
    该回复于2008-08-22 15:23:15被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cppowner
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:03:598楼 得分:0
    友情up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • keiy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      7

      5

    发表于:2008-08-22 10:21:479楼 得分:80
    我的测试程序:
    tp.bbr 含t.cpp:
    C/C++ code
    //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "t.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- extern "C" _stdcall __declspec(dllexport) int showme(int x1,double &x2,int &x3) { x3=x1+1000; x2=3.45; return 100; }

    tp1.bpr含t1.cpp:
    C/C++ code
    //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "t1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { typedef int (__stdcall *showme)(int x1,double &x2,int &x3); HINSTANCE DLLhInstance; DLLhInstance=LoadLibrary("tp.exe"); if(!DLLhInstance) { ShowMessage("error"); return ; } showme pshowme =(showme)GetProcAddress(DLLhInstance,"showme"); int x1,x3,r; double x2; if(pshowme ) { x1=10; r=pshowme(x1,x2,x3); Edit1->Text=r; Edit2->Text=x1; Edit3->Text=x2; Edit4->Text=x3; } FreeLibrary(DLLhInstance); } //---------------------------------------------------------------------------

    要注意的是,在showme中只能调用静态函数(如sin/ato等等)

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zxjrainbow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-15 15:44:0010楼 得分:0
    keiy,
    不好意思,现在才看到。
    因为我要调用的函数不可能只用静态函数的,还要做new,数据库POST等操作。
    所以我现在已经放弃这种方法了。
    谢谢。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved