gpt4 book ai didi

DLL 自行卸载

转载 作者:行者123 更新时间:2023-12-04 21:03:05 27 4
gpt4 key购买 nike

DLL 中的函数是否可以卸载 DLL?我需要这样做,以确保 DLL 未在使用中,然后写入 DLL 的文件。

最佳答案

据我了解,它可以完成并且有时是必须完成的(例如,在通过 CreateRemoteThread 和其他方法注入(inject) dll 的情况下)。所以,

FreeLibraryAndExitThread(hModule, 0)

会做到这一点。

另一方面,调用
FreeLibrary(hModule)

不会在这里做 - 来自 MSDN:“如果他们分别调用 FreeLibrary 和 ExitThread,则会存在竞争条件。可以在调用 ExitThread 之前卸载库。”需要说明的是,ExitThread 除了从线程函数返回之外还做了一些记账。

所有这些都假设您的 Dll 通过调用 获得了 hModule 本身。加载库 从加载的 Dll 内部,或者更确切地说,从加载的 Dll 内部调用以下函数:
GetModuleHandleEx
(
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
(LPCTSTR)DllMain,
&hModule
)

这会增加 Dll 的引用计数,因此您知道,如果您稍后使用该句柄释放库并且该库确实已卸载,那么您拥有对它的最后引用。

如果您跳过增加 Dll 的引用计数并仅从 的参数中获取 hModule DLLMain 期间DLL_PROCESS_ATTACH 那么你不应该调用 FreeLibraryAndExitThread 因为加载 Dll 的代码仍在使用它,而且这个模块句柄真的不是你来管理的。

关于DLL 自行卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3410130/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com