switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: //进程调用LoadLibrary g_hInst = (HINSTANCE)hModule;//在这里保存hinstance case DLL_THREAD_ATTACH: //线程调用LoadLibrary case DLL_THREAD_DETACH: //线程调用FreeLibrary case DLL_PROCESS_DETACH: //进程调用FreeLibrary break; }
检查一下你在DllMain的什么地方赋值的,会不会有问题,其他地方还有没有赋值,装载是否成功等等。
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
g_hInstance = (HINSTANCE)hModule;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
在程序结束时,才FreeLibrary的.
HINSTANCE hinst = NULL; HWND hwndDLG = NULL; BOOL CALLBACK DlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);BOOL CALLBACK AboutProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);extern "C" __declspec(dllexport) void ShowDlg(); BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: hinst = (HINSTANCE)hModule; case DLL_PROCESS_DETACH: break; } return TRUE;}
{
case DLL_PROCESS_ATTACH: //进程调用LoadLibrary
g_hInst = (HINSTANCE)hModule;//在这里保存hinstance
case DLL_THREAD_ATTACH: //线程调用LoadLibrary
case DLL_THREAD_DETACH: //线程调用FreeLibrary
case DLL_PROCESS_DETACH: //进程调用FreeLibrary
break;
}
#pragma data_seg("Shared")HINSTANCE g_hIns = NULL;#pragma data_seg()#pragma comment(linker,"/Section:Shared,rws") //设置全局共享数据段的属性