在C ++中禁用自动DLL加载

时间:2009-10-03 15:53:50

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

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

也许是否有人熟悉实现这一目标的方法?

6 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

  

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

如果要使用LoadLibraryGetProcAddress手动加载,则不应将其*.lib文件传递给链接器。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

您可以挂钩延迟加载机制。将__pfnDliNotifyHook2设置为您提供的功能,并在该挂钩中直接终止您的应用程序。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

我的意思是,你可以提供自己的函数来加载DLL,并从那里崩溃你的应用程序。详细信息请参见提供的链接。