【发布时间】:2010-08-10 23:43:00
【问题描述】:
在 Windows 中是否有某种方法可以防止通过 FreeLibrary 卸载我们的 dll? IE。在整个过程的生命周期中将其“固定”在内存中?
【问题讨论】:
-
通常,dll 服从于加载它们的可执行文件。如果该可执行文件决定不再需要该 dll 并调用 FreeLibrary,那么您为什么要让您的 dll 继续存在呢?换句话说:您为什么要寻找一种方法来做到这一点?
在 Windows 中是否有某种方法可以防止通过 FreeLibrary 卸载我们的 dll? IE。在整个过程的生命周期中将其“固定”在内存中?
【问题讨论】:
我知道这是一个旧线程,但有一个“正确”的方法可以做到这一点:
使用GET_MODULE_HANDLE_EX_FLAG_PIN 标志调用GetModuleHandleEx。
来自MSDN:
无论调用多少次 FreeLibrary,模块都会保持加载状态,直到进程终止。
以防万一其他人发现此线程...
【讨论】:
是的。在该 DLL 上调用 LoadLibrary()。这将增加内部引用计数。 FreeLibrary() 仅在其内部引用计数降至零时卸载 DLL。如果您 LoadLibrary 而不是 FreeLibrary,则 DLL 将在您的进程的整个生命周期内卡在内存中。
如果您遇到有人在您的 DLL 上调用 FreeLibrary() 并导致它在您仍在使用它时从内存中删除的情况,您可能遇到了错误 - 对谁拥有它存在分歧或误解DLL 并负责释放它。一个应该修复而不是通过 LoadLibrary hack 解决的错误。
【讨论】:
GetModuleHandleEx() 函数和来自Windows API(可用Windows XP 和Windows Server 2003)的GET_MODULE_HANDLE_EX_FLAG_PIN 标志比尝试增加引用计数的想法要好得多。
MSVC 具有“延迟加载 DLL”和支持“延迟加载 DLL 卸载”的选项(至少在 VC 2005+ 中)。可能还值得研究这些设置,确保不支持卸载。
【讨论】: