如果使用 FreeLibrary卸載自身DLL的話會出現一個問題,在 FreeLibrary 之後,該 DLL 的地址空間就不再可用了,但這時 EIP 指針仍然會指向 FreeLibrary 的下面一句,於是程序就會崩潰。所幸,Win32 提供了另外的一個 API——FreeLibraryAndExitThread,這個函數能夠在銷毀 DLL 之後直接調用 ExitThread,這樣一來 EIP 指針就不會指向非法的地址了。 [cpp] #include <Windows.h> HMODULE g_hDll = NULL; DWORD WINAPI UnloadProc(PVOID param) { MessageBox(0,"test","test",0); FreeLibraryAndExitThread(g_hDll,0); return 0; } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, PVOID lpvReserved) { if (DLL_PROCESS_ATTACH == fdwReason) { g_hDll = (HMODULE)hinstDLL; HANDLE hThread = CreateThread(NULL, 0, UnloadProc, NULL, 0, NULL); CloseHandle(hThread); } return TRUE; }