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

时间:2015-09-12 00:11:52

标签: c++ winapi dll msvcrt

我有一个奇怪的问题,我正在尝试为某人工作。我无法访问代码。有一个加载DLL的程序,并且有一些插件框架。除了如何从DLL导入函数以及用于导出的调用约定之外,它们几乎不提供任何文档。

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

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

是的,我知道这只是在寻找麻烦,访问违规并不令人意外,但遗憾的是,我必须处理别人的问题。

无论如何,我的问题是: 让我们说从这个DLL导入,里面是对msvcr120提供的函数的调用。当程序调用导入时,它是否可能从msvcr调用它是静态链接到而不是从msvcr120?

我意识到它可能取决于主程序的插件框架,但一般的反馈将不胜感激。

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

由于您使用的程序与CRT静态链接,因此无法可靠地插入。反调试器代码简直太傻了;有几种方法可以解决它。如果您支付了费用,请将其退回并要求退款。