c++ - 混合来自不同 MSVC 的 DLL 时的不同行为
问题描述
我知道混合来自不同 MSVC 的 DLL 是不好的,应该避免。在这里,我想知道他们不同行为的原因。
背景:
我在我的应用程序中使用带有隐式链接的第三方库(XXX.dll、XXX.lib 和 XXX.h)。它们都是 x64 的。
- 我的应用程序是使用MSVC 2015构建的。
- 第 3 方 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/Heap 并且指针传输不起作用时,这听起来很合理。)
问题:
为什么它适用于 Windows 7?
我使用相同的 MSVC2015 工具链并且期望相同的行为。或者有什么与操作系统相关的吗?
谢谢。
解决方案
事实上,最初的问题并不是真的有效。当我查看堆栈跟踪时。该异常实际上是由 XXX.DLL 中的 (msvcr90.dll) 线程引发的。
这是更详细的问题
推荐阅读
- c++ - 什么是组合的正确代码生成
- android - 无法在新活动中的 firebase 回收器视图适配器上从 firebase 数据库加载数据
- java - Cordova 找不到 JAVA_HOME
- javascript - 如何使用带有文本而不是空/数字的 VuetifyJS 时间选择器组件?
- php - 使用 phpspreadsheet 使用 excel 文件填充 mysql 数据库
- python - 是否保留以下 IP-Range 100.64.0.0/10?
- c++ - 如果静态变量只为程序的整个部分存储了一份副本,为什么我不能使用静态变量交换 2 个数字?
- javascript - 使用 Admin SDK 批量写入 Firestore
- jquery - Tinymce 按钮未出现在某些页面中
- java - 将 JPanel 添加到 JLayeredPane 会导致不调用paint() 方法