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

时间:2018-08-08 07:35:49

标签: c++ visual-studio dll windows-10

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

背景:

具有随附的第3方库(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填充的字符串

不同的设置:

在Windows 7(x64)上

它很好用。

在Windows 10(x64)上

由于读取无效的内存位置,我从XXX.dll中获得访问冲突异常。 (即致电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工具链,并且预期会有相同的行为。 还是操作系统相关?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

这是更详细的问题

Debug 3rd party DLL causing access violation after upgrading to Windows 10