【问题标题】:Is it possible to pin a dll in memory to prevent unloading?是否可以将 dll 固定在内存中以防止卸载?
【发布时间】:2010-08-10 23:43:00
【问题描述】:

在 Windows 中是否有某种方法可以防止通过 FreeLibrary 卸载我们的 dll? IE。在整个过程的生命周期中将其“固定”在内存中?

【问题讨论】:

  • 通常,dll 服从于加载它们的可执行文件。如果该可执行文件决定不再需要该 dll 并调用 FreeLibrary,那么您为什么要让您的 dll 继续存在呢?换句话说:您为什么要寻找一种方法来做到这一点?

标签: c++ windows dll


【解决方案1】:

我知道这是一个旧线程,但有一个“正确”的方法可以做到这一点:

使用GET_MODULE_HANDLE_EX_FLAG_PIN 标志调用GetModuleHandleEx

来自MSDN

无论调用多少次 FreeLibrary,模块都会保持加载状态,直到进程终止。

以防万一其他人发现此线程...

【讨论】:

    【解决方案2】:

    是的。在该 DLL 上调用 LoadLibrary()。这将增加内部引用计数。 FreeLibrary() 仅在其内部引用计数降至零时卸载 DLL。如果您 LoadLibrary 而不是 FreeLibrary,则 DLL 将在您的进程的整个生命周期内卡在内存中。

    如果您遇到有人在您的 DLL 上调用 FreeLibrary() 并导致它在您仍在使用它时从内存中删除的情况,您可能遇到了错误 - 对谁拥有它存在分歧或误解DLL 并负责释放它。一个应该修复而不是通过 LoadLibrary hack 解决的错误。

    【讨论】:

    • 同意。可以肯定地调用它大约 60,000 次。
    • 见鬼,叫它一百万次——“只是为了确定。”
    • 当然,您必须在 FreeLibrary 发生时继续调用 LoadLibrary,您不能保证它们只尝试并释放一次。
    • 看来使用GetModuleHandleEx() 函数和来自Windows API(可用Windows XP 和Windows Server 2003)的GET_MODULE_HANDLE_EX_FLAG_PIN 标志比尝试增加引用计数的想法要好得多。
    【解决方案3】:

    MSVC 具有“延迟加载 DLL”和支持“延迟加载 DLL 卸载”的选项(至少在 VC 2005+ 中)。可能还值得研究这些设置,确保不支持卸载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多