【问题标题】:Disable automatic DLL loading in C++在 C++ 中禁用自动 DLL 加载
【发布时间】:2010-12-03 14:26:50
【问题描述】:

我的场景如下:我的应用程序依赖于某个 DLL(我在链接期间使用它的 lib)。但是,当我的应用程序执行时,我想使用 LoadLibrary 显式加载该 DLL。但是,默认情况下,当代码到达需要该 DLL 的范围时,环境会自动查找它,然后加载它。我想禁用这种行为,而且我关心的是,如果应用程序达到了它想要执行属于该 DLL 的代码的程度,我更喜欢它会崩溃而不是自动加载它(所以 DLL 只会被加载因为我明确地调用了 LoadLibrary)。
同时,我正在使用延迟加载功能(因此只有在实际需要加载 DLL 时才会触发加载)。但是,如果 DLL 尚未加载,我希望应用程序会崩溃。

也许这里有人熟悉实现此目的的方法?

【问题讨论】:

  • 你能告诉我们你为什么要这样做的背景吗?

标签: c++ dll loadlibrary dynamic-loading delay-load


【解决方案1】:

如果您想使用LoadLibrary,请不要将应用程序与导入库链接。 PE 格式不支持未解析的外部,因此您要么使用标头和dllimport,要么使用LoadLibraryGetProcAddress 和指向函数的指针。

【讨论】:

    【解决方案2】:

    (我在链接时使用它的lib)

    如果您想使用LoadLibraryGetProcAddress 手动加载它,那么您不应将其*.lib 文件传递​​给您的链接器。

    【讨论】:

      【解决方案3】:

      您可以通过不链接 DLL 的导入库(.lib 文件)来防止自动加载。然后,您可以在需要时使用 LoadLibrary 手动加载 DLL。

      我发布了一篇关于做这种事情的博客文章here

      【讨论】:

        【解决方案4】:

        您可以挂钩延迟加载机制。将__pfnDliNotifyHook2 设置为您提供的函数,然后在该挂钩中简单地终止您的应用程序。

        【讨论】:

          【解决方案5】:

          延迟加载功能在第一次函数调用之前不会加载 dll,而不是作用域。如果您有调用该 dll 的全局初始化程序,那么这可能就是您认为它基于作用域的原因。 我的公司使用在使用前调用 LoadLibrary 的技术没有问题。我建议进一步挖掘您的问题。

          【讨论】:

            【解决方案6】:

            这是您需要的吗:http://msdn.microsoft.com/en-us/library/151kt790(VS.80).aspx

            我的意思是,您可以提供自己的函数来加载 DLL,然后从那里崩溃您的应用程序。提供的链接中有详细说明。

            【讨论】:

              猜你喜欢
              • 2019-05-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多