DLL 中的函数是否可以卸载 DLL?我需要这样做,这样我才能确保 DLL 未在使用中,然后写入 DLL 的文件。
最佳答案
据我了解,它可以完成并且有时应该完成(例如在通过 CreateRemoteThread 和其他方法注入(inject) dll 的情况下)。所以,
FreeLibraryAndExitThread(hModule, 0)
将准确地做到这一点。
另一方面,调用
FreeLibrary(hModule)
不会在此处执行 - 来自 MSDN:“如果他们分别调用 FreeLibrary 和 ExitThread,则会存在竞争条件。可以在调用 ExitThread 之前卸载库。” 作为评论, ExitThread 除了从线程函数返回之外还做一些簿记工作。
所有这些假设你的 Dll 通过从加载的 Dll 内部调用 LoadLibrary 获得 hModule 本身,或者更确切地说,通过从加载的 Dll 内部调用以下函数:
GetModuleHandleEx
(
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
(LPCTSTR)DllMain,
&hModule
)
这会增加 Dll 的引用计数,因此您知道如果您稍后使用该句柄释放该库,并且如果该库确实已卸载,则您拥有对它的最后引用。
如果您在 DLL_PROCESS_ATTACH 期间跳过增加 Dll 的引用计数并仅从 DllMain 的参数获取 hModule,那么您不应该调用 FreeLibraryAndExitThread,因为加载 Dll 的代码仍在使用它,并且这个模块句柄确实不是您可以管理的。
关于DLL 自行卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49507994/