各位大侠。我首先再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,请教该如何解决呢?
在定义.h文件里改了试试
EXPORTS
void MyFunction();
这样在其他应用程序中调用这个导出函数的时候,就不会出现找不到这个函数的问题了(一般情况下,如果找不到函数GetProcAddress()函数的返回值为空),而且如果调用DLL中导出函数的应用程序是其他开发语言编写的程序,用.def这种方法同样适用,而第一种方法就不适用了!
回调类型的声明:
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);回调函数许单独定义,调用者只需传入函数指针。