DLL 自行卸载

标签 dll self-reference

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/

相关文章:

java - 64 位 java 应用程序使用 32 位 dll

c - c : different approaches 中的库错误管理

C 函数指针回调作为具有 "self"引用参数的结构成员

c# - Entity Framework ..自引用表..获取深度=x的记录?

c# - 帮助使“Windows Input Simulator” C#界面正常工作

c# - 在 C# 中捕获从 Delphi DLL 抛出的异常

c++ - 查询的类成员返回错误值

未定义 Python cx_Freeze 名称 __file__

c# - 有没有更好的方法来 self 引用类型?

C++ 模板类自引用