2

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

也许这里的任何人都熟悉实现这一目标的方法?

4

6 回答 6

6

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

于 2009-10-03T16:00:23.337 回答
4

(我在链接期间使用它的库)

如果你想手动加载它LoadLibraryGetProcAddress那么你不应该将它的*.lib文件传递给你的链接器。

于 2009-10-03T15:58:56.940 回答
2

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

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

于 2009-10-03T16:00:59.967 回答
1

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

于 2009-10-05T10:32:26.457 回答
0

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

于 2009-10-03T16:15:59.167 回答
0

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

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

于 2009-10-03T16:27:04.793 回答