混合来自不同 MSVC 的 DLL 时的行为不同



我知道混合来自不同MSVC的DLL是不好的,应该避免。 在这里,我想知道他们不同行为的原因。

背景:

附带 (XXX.dll、XXX.lib 和 XXX.h( 的第三方库 我在我的应用程序中使用它隐式链接。 它们都是 x64。

  • 我的应用程序是使用 MSVC 2015 构建的。
  • 第三方XXX.dll显然是用MSVC 2008构建的,并且
    • 不幸的是,来自 XXX 的函数调用中涉及指针.dll
    • 例如 int __stdcall func1(const char * arg);将字符串作为参数
    • 例如 int __stdcall func2(char * arg);让字符串由 DLL 填充

不同的设置:

在视窗 7 (x64( 上

它工作得很好。

在视窗 10 (x64( 上

由于读取无效的内存位置.dll我收到来自 XXX 的访问冲突异常。(即呼叫int __stdcall func1(const char * arg); (

Exception thrown at 0x000001EF05A2BBB9 (XXX.dll) in Application.exe: 0xC0000005: Access violation reading location 0x00000000074A3A68.

(当有两个 CRT/堆并且指针传输不起作用时,这听起来很合理。

问题:

为什么它可以在Windows 7上运行?

我使用相同的MSVC2015工具链,并期望相同的行为。 还是与操作系统有关?

谢谢。

事实上,最初的问题并不真正有效。 当我查看堆栈跟踪时。该异常实际上是由 XXX.DLL 中的 (msvcr90.dll( 线程引发的。

这是更详细的问题

调试升级到 Windows 10 后导致访问冲突的第三方 DLL

最新更新