使用LoadLibrary加载DLL时出现了两次加载。

3

我有A.DLLB.DLL

使用VS 2010,在A.DLL项目的C++函数中设置断点,并使用procexp.exe查看当前加载的DLL。显然,A.DLL已被加载。

我需要从这个函数调用B.DLL。注意:B.DLL依赖于A.DLL库。该库名为A.LIB

使用LoadLibrary,我执行以下语句:

HANDLE hLib = LoadLibrary("B.DLL");

执行这行代码后,我再次查看procexp.exe发现A.DLL被加载了两次!!如果我取消A.LIBB.DLL的依赖,这种情况就不会发生。Process Explorer报告说这两个A.DLL实例具有不同的基本地址,因此它们确实是不同的模块。
我的问题是为什么会加载另一个A.DLL?它是否可能意识到A.DLL已经加载过了?

它们是同一个 A.DLL 吗?你确定没有从不同的文件路径加载了两个不同的 A.DLL 吗? - Adam Rosenfield
procexp 显示它们来自相同的文件路径、相同的版本和相同的时间戳。由于某种原因,它实际上创建了两个相同的 DLL。 - ryrich
1
当您调用LoadLibrary("B.DLL")时,A.DLL的第二个实例将被加载。查看B.DLL的PE导入表。使用dumpbin进行操作。记下用于指定A.DLL的确切名称。然后对具有对A.DLL依赖项的主机exe执行相同操作。它是一样的吗?我相信在构建主机exe和B.DLL时使用了相同的A.LIB文件。 - David Heffernan
@DavidHeffernan:那是哪个dumpbin命令行选项?/IMPORTS?(以前从未使用过) - ryrich
是的,我认为那就是它。 - David Heffernan
1个回答

0

所以我无法理解为什么会加载两次A.DLL,因此我重构了我的代码并想出了更好的解决方案。(最终对我来说效果很好)

我删除了B.DLLA.DLL的库依赖关系,而是使用了一个函数指针来代替通过A.LIB公开的可导出函数,并将其通过调用LoadLibrary、GetProcAddress等传递下去。

这样做就不会再加载A.DLL两次了,现在一切都很好 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接