【发布时间】:2015-08-25 21:42:54
【问题描述】:
我正在处理的项目两次加载同一个库:
- 使用 LoadLibrary
- 使用 lib 文件和“__declspec(dllimport/dllexport)”静态加载 DLL。
在这种情况下发生了什么?这两个“加载”是使用相同的堆还是共享其他东西。例如。是否与两次调用 LoadLibrary 相同或相似?
我的一般问题是,当通过第二种方法从 exe 调用 dll 方法时,我遇到了堆栈损坏问题。我想知道问题是否可能是因为第一次加载?所有项目都使用相同的 RT、对齐等。
【问题讨论】:
-
LoadLibrary并不总是加载库。相反,它可以增加已加载 DLL 的引用计数。 -
此外,静态依赖项 (
dllimport) 的加载发生在您有机会调用LoadLibrary之前(除非您使用延迟加载),因此您的数字与实际发生的顺序相反. -
您找到原因了吗(很可能在您的动态 dll/lib 导入系统中)?
-
是的,我找到了根本原因,它与 DLL 加载无关。问题在于结构对齐错误。
-
另见LoadLibrary Reference Counting。如果它是同一个 DLL,那么它只加载一次。额外的
LoadLibrary调用会增加引用计数。
标签: visual-c++ dll static-linking dynamic-linking loadlibrary