c++ - 如果 exe 静态链接到不同的 msvcr,导入的 DLL 函数是否会调用错误的函数版本?

标签 c++ winapi dll msvcrt

我有一个奇怪的问题,我正试图为某人解决。我无权访问代码。有一个加载 DLL 的程序并具有某种插件框架。除了如何从 DLL 中导入函数以及用于导出的调用约定之外,它们几乎没有提供任何文档。

此人的插件从 DLL 导入函数(假设他们使用了正确的调用约定并正确导入)。它会定期遇到访问冲突(通常是从 0x0000000 写入/读取访问冲突)。有时,它会使程序崩溃,并且事件查看器显示异常代码 0xc0000005(另一个访问冲突)和错误模块 SHLWAPI.dll。

使用 depends,我确定该程序静态链接到 msvcr。我发现插件 DLL 动态链接到 msvcr120.dll。

是的,我知道这只是自讨苦吃,访问违规并不奇怪,但不幸的是,我必须处理别人的问题。

无论如何,我的问题是: 假设是从此 DLL 导入的,内部是对 msvcr120 提供的函数的调用。当程序调用 imported 时,它是否可能从静态链接到的 msvcr 而不是从 msvcr120 调用?

我意识到这可能取决于主程序的插件框架,但我们将不胜感激。

提前致谢!

最佳答案

在一个程序中使用多个 CRT 拷贝时存在已知问题,即使它们都使用相同版本的 CRT(参见 Potential Errors Passing CRT Objects Across DLL Boundaries)。如果CRT是不同的版本,由于内部结构的大小或布局不同,还会出现很多其他问题。

由于您使用的程序与 CRT 静态链接,因此无法可靠地插入。反调试器代码非常愚蠢;有几种解决方法。如果您已付款,请将其退回并要求退款。

关于c++ - 如果 exe 静态链接到不同的 msvcr,导入的 DLL 函数是否会调用错误的函数版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32533823/

相关文章:

c++ - 有条件地向前或向后迭代的优雅方式

c++ - 为什么不首先将类(class)成员设置为公开?

windows - 将Win32封装在一个类中——在CreateWindow中传递类指针

winapi - 检测自上次扫描以来文件系统中的更改

c++ - g++4.9 和 g++5 在初始化列表中缩小时的不同行为

windows - 是否有适用于 Windows Vista/7/8 的新 Midi API?

c# - 如何将 MySQL.Data 与我的 ClickOnce 应用程序打包在一起?

c++ - 程序无法启动,因为您的计算机缺少 mfc120ud.dll

Python.Net 无法导入 dll

c++ - 如何使 C++(共享)库与 clang 和 GCC 兼容?