为什么找不到dll中的函数?

popy007 2003-11-19 11:57:42

各位大侠。我首先再win32下编写了一个mydll.dll:

#ifdef MYDLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

#include <windows.h>

DLL_API int CALLBACK MyDllApi();

DLL_API int CALLBACK MyDllApi(){

return MessageBox(NULL, TEXT("MyDllApi"), TEXT("MyDllApi()"), MB_OK);
}

生成了mydll.dll

然后用一个程序测试它:

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int){

typedef int (CALLBACK * PFNMYDLLAPI)();
PFNMYDLLAPI pfnMyDllApi;

HINSTANCE hLibrary = LoadLibrary(TEXT("mydll.dll"));

if(!hLibrary){
MessageBox(NULL, TEXT("Couldn't find mydll.dll"), TEXT("Error"), MB_OK);
return FALSE;
}

pfnMyDllApi = (PFNMYDLLAPI)GetProcAddress(hLibrary, TEXT("MyDllApi"));

if(pfnMyDllApi){
pfnMyDllApi();
}
else{ // ***************************
MessageBox(NULL, TEXT("Couldn't get process address"), TEXT("ERROR"), MB_OK);
}

FreeLibrary(hLibrary);

return TRUE;
}

我已经把mydll.dll放到了这个程序的目录里面,可每次执行都是

// ***************************里面的东西,也就是

GetProcAddress()并没有找到MyDllApi,请教该如何解决呢?
...全文
935 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangbab 2003-11-20
  • 打赏
  • 举报
回复
//dll中
回调类型的声明:
typedef int (WINAPI *PFCALLBACK)(int Param1,int Param2) ;//定义回调函数类型
导出函数。
extern "C" DLL_API int MyDllApi(PFCAllBACK Func); //你的导出函数

////////////////////////
//exe中调用
int WINAPI MyFunc(int Parm1,intParm2)
{
...
}
typedef int (pMyDllApi*)(PFCALLBACK);
pMyDllApi=::GetProcess(hLibrary, TEXT("MyDllApi"));
pMyDllApi(MyFunc);

回调函数许单独定义,调用者只需传入函数指针。
sxslyy 2003-11-20
  • 打赏
  • 举报
回复
对,加上了extern "C"
ruihuahan 2003-11-20
  • 打赏
  • 举报
回复
extern "C"的问题
popy007 2003-11-20
  • 打赏
  • 举报
回复
extern "C" DLL_API int MyDllApi();

为什么定义成回调函数,即

extern "C" DLL_API int CALLBACK MyDllApi();

后GetProcAddress()就找不到MyDllApi了呢?
txdxun 2003-11-19
  • 打赏
  • 举报
回复
CALLBACK去掉看看
54yuandian 2003-11-19
  • 打赏
  • 举报
回复
extern "C" DLL_API int CALLBACK MyDllApi();
在定义.h文件里改了试试
popy007 2003-11-19
  • 打赏
  • 举报
回复
加上了extern "C"并且要去掉 CALLBACK才正确,不知道什么时候加CALLBACK,

是否extern "C"和CALLBACK不能够共存?
vcforever 2003-11-19
  • 打赏
  • 举报
回复 1
当你生成DLL文件中的导出函数列表的时候C++编译器有可能会改变你的导出函数的名称,要避免编译器改变你的函数名称的话可以向一楼说的那样在前面加上一个extern "C"来让避免编译器将导出函数改名

另一种方法也是比较通用的方法是给你的DLL工程中加入一个.def文件,在.def文件中的EXPORTS下面写上你的导出函数的名称例如:
EXPORTS
void MyFunction();
这样在其他应用程序中调用这个导出函数的时候,就不会出现找不到这个函数的问题了(一般情况下,如果找不到函数GetProcAddress()函数的返回值为空),而且如果调用DLL中导出函数的应用程序是其他开发语言编写的程序,用.def这种方法同样适用,而第一种方法就不适用了!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧