TEST_CASE("MyProject/MyTest","Do the test.") { MockDbService mockDbService; Foobar foo(L"{F00DFACE-Feed-DEAD-BEEF-C0FFeedECADE}",mockDbService); foo.loadObject(); REQUIRE(mockDbService.getMethodInvokeCount("query()") >= 1); }
Foobar是从被测MFC DLL导出的类.但是,测试框架会报告意外的异常.在将字符串复制到Foobar的构造函数时,我将其跟踪到std :: wstring的复制构造函数. MSVC调试器将源字符串报告为< Bad Ptr>.
我创建了一个虚拟构造函数,Foobar :: Foobar(long num,IDbService& db),所有的值(包括IDbService&)都很好.
MFC DLL和我的单元测试EXE都共享一个属性表,它应该保持编译器标志等效.我正在调试模式下构建并运行测试.任何想法为什么std :: wstring无法复制到DLL?
解决方法
(一种捷径可能是在类接口上使用const wchar_t *而不是std :: wstring,只需从构造函数体内的原始指针构建一个std :: wstring).
编辑:您确认CRT不匹配(即使用/ MD构建的EXE与使用/ MDd构建的DLL)是问题所在.事实是,相同的类名std :: wstring意味着调试版本(/ MDd)和发布版本(/ MD)中有两个不同的类.实际上,在调试版本中,类实现中可以有其他机制来帮助调试;这种机制可能会导致效率低下,因此在发布版本中将其删除.因此,debug build的std :: wstring的内部结构与release build的std :: wstring不同(例如,如果你尝试打印std :: wstring实例的原始sizeof,你可以在发布版本和调试版本中找到不同的数字) .因此,使用/ MD构建的EXE期待release-build的std :: wstring;相反,使用/ MDd构建的DLL期望调试构建的std :: wstring:这两个期望之间存在不匹配(一个模块期望X类,但另一个模块正在给Y类),因此您遇到了崩溃.