【问题标题】: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,要么使用LoadLibrary、GetProcAddress 和指向函数的指针。
【解决方案2】:
(我在链接时使用它的lib)
如果您想使用LoadLibrary 和GetProcAddress 手动加载它,那么您不应将其*.lib 文件传递给您的链接器。
【解决方案3】:
您可以通过不链接 DLL 的导入库(.lib 文件)来防止自动加载。然后,您可以在需要时使用 LoadLibrary 手动加载 DLL。
我发布了一篇关于做这种事情的博客文章here。
【解决方案4】:
您可以挂钩延迟加载机制。将__pfnDliNotifyHook2 设置为您提供的函数,然后在该挂钩中简单地终止您的应用程序。
【解决方案5】:
延迟加载功能在第一次函数调用之前不会加载 dll,而不是作用域。如果您有调用该 dll 的全局初始化程序,那么这可能就是您认为它基于作用域的原因。
我的公司使用在使用前调用 LoadLibrary 的技术没有问题。我建议进一步挖掘您的问题。