0

我们有一个 dll(由我们公司开发,我们有源代码),它由另一个应用程序托管和加载(我们没有源代码),最近由于 std 字符串,我们有很多访问冲突异常:

76FAE228:000196 [76FAE3BE] RtlInitializeGenericTable (ntdll.dll)
76FADFA5:00007E [76FAE023] RtlGetCompressionWorkSpaceSize (ntdll.dll)
749714C9:000014 [749714DD] HeapLock (kernel32.dll)
730B3B4E:0000CD [730B3C1B] free (msvcr90.dll)
736A5DFB:000035 [736A5E30] ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEX_NI@Z (msvcp90.dll) 
736A5EBB:000009 [736A5EC4] ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ (msvcp90.dll)

如您所见,我们使用多线程 DLL (/MD) 作为运行时库并使用 Platform toolset v90...

我们怀疑托管应用程序将平台工具集更改为更新版本,是什么导致了问题,问题是我找不到托管应用程序的平台工具集(他们使用多线程(/MT)作为运行时库) Process Walker也没有帮助......

如果托管应用程序使用 /MT,我如何找到它们的平台工具集?

谢谢...

4

1 回答 1

0

多种解决方案(从最差到更好的顺序):1)如果您的 dll 带有头文件,请添加一个全局内联 init 函数来检查 _MT 和 _DLL 是否已定义(请参阅http://msdn.microsoft.com/en-us/库/vstudio/abx4dbyh.aspx

2)您可以使用 EnumProcessModules(http://msdn.microsoft.com/en-us/library/ms682631%28VS.85%29.aspx)遍历程序中加载的 dll,并检查是否加载了 msvcrtxxx.dll。不过要小心,当您执行 ccheck 时,可能不会加载 msvcrtxxx.dll。

3) 将您的 dll 导出方法设计为无 crt,例如不要按值传递类 (std::string) 实例、crt 对象(文件 ..etc);如果您提供一种分配/销毁实例的方法,则指向类的指针是可以的;

于 2013-07-25T10:34:53.640 回答