2013-04-25 102 views
3

我有A.DLLB.DLLDLL加载两次使用调用LoadLibrary

使用VS 2010,我设置C++函数断点在A.DLL项目并使用procexp.exe看到当前加载的DLL什么。显然,加载了A.DLL

我需要从这个函数调用B.DLL。注意:B.DLLA.DLL有依赖库。这个库被称为A.LIB

使用LoadLibrary,我执行语句:

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

执行完这条线,我看procexp.exe一次。 A.DLL被加载两次!如果我删除对B.DLLA.LIB依赖项,则不会发生。 Process Explorer报告A.DLL的两个实例具有不同的基址,因此它们确实是不同的模块。

我的问题是为什么这会加载A.DLL的另一个实例?是否有可能实现A.DLL已经加载?

+0

他们是在同一* *'A.DLL'?你确定你没有从不同的文件路径加载两个不同的'A.DLL'吗? – 2013-04-25 18:47:31

+0

procexp显示它们来自相同的文件路径,相同的版本和相同的时间戳。由于某种原因,它实际上创建了相同的DLL两次 – ryrich 2013-04-25 18:48:56

+1

当您调用LoadLibrary(“B.DLL”)时,加载'A.DLL'的第二个实例''查看'B.DLL'的PE导入表。为此使用dumpbin。记下用于指定'A.DLL'的确切名称。然后对具有依赖于'A.DLL'的主机exe执行相同的操作。它是一样的吗?我相信你在生成主机exe和'B.DLL'时使用相同的'A.LIB'文件。 – 2013-04-25 19:03:22

回答

0

所以我无法弄清楚为什么A.DLL被加载两次的原因,所以我继续前进,重构我的代码,并提出了一个更好的解决方案。 (这结束了对我工作的罚款)

代替B.DLL其上A.DLL库的依赖,我删除了依赖和的,而不是具有通过A.LIB暴露出一些出口的功能,我用了一个function pointer该功能,并通过它通过我对LoadLibrary,GetProcAddress等的调用。

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

相关问题