如果使用 FreeLibrary卸载自身DLL的话会出现一个问题,在 FreeLibrary 之后,该 DLL 的地址空间就不再可用了,但这时 EIP 指针仍然会指向 FreeLibrary 的下面一句,于是程序就会崩溃。所幸,Win32 提供了另外的一个 API——FreeLibraryAndExitThread,这个函数能够在销毁 DLL 之后直接调用 ExitThread,这样一来 EIP 指针就不会指向非法的地址了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#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; } |
转载请注明:exchen's blog » DLL卸载自身