各位大侠。我首先再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,请教该如何解决呢?

解决方案 »

  1.   

    extern "C" DLL_API int CALLBACK MyDllApi();
    在定义.h文件里改了试试
      

  2.   

    当你生成DLL文件中的导出函数列表的时候C++编译器有可能会改变你的导出函数的名称,要避免编译器改变你的函数名称的话可以向一楼说的那样在前面加上一个extern "C"来让避免编译器将导出函数改名另一种方法也是比较通用的方法是给你的DLL工程中加入一个.def文件,在.def文件中的EXPORTS下面写上你的导出函数的名称例如:
    EXPORTS
        void MyFunction();
    这样在其他应用程序中调用这个导出函数的时候,就不会出现找不到这个函数的问题了(一般情况下,如果找不到函数GetProcAddress()函数的返回值为空),而且如果调用DLL中导出函数的应用程序是其他开发语言编写的程序,用.def这种方法同样适用,而第一种方法就不适用了!
      

  3.   

    加上了extern "C"并且要去掉 CALLBACK才正确,不知道什么时候加CALLBACK,是否extern "C"和CALLBACK不能够共存?
      

  4.   

    //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);回调函数许单独定义,调用者只需传入函数指针。
      

  5.   

    extern "C" DLL_API int MyDllApi();为什么定义成回调函数,即extern "C" DLL_API int CALLBACK MyDllApi();后GetProcAddress()就找不到MyDllApi了呢?