无法跨DLL传递std :: wstring

Bre*_*hns 6 c++ dll visual-studio-2010 visual-c++

我在Visual Studio 2010中设置了一个项目,以针对现有的MFC DLL编写单元测试.我正在使用单头单元测试框架,并链接到单元测试项目中的MFC DLL的lib包装器.我正在尝试构建一个接受std::wstring它的构造函数的类.这是我的测试的样子:

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);
}
Run Code Online (Sandbox Code Playgroud)

Foobar从测试中的MFC DLL导出的类在哪里.但是,测试框架会报告意外的异常.std::wstring在将字符串复制到构造函数时,我将其跟踪到了复制构造Foobar函数.MSVC调试器将源字符串报告为<Bad Ptr>.

我创建了一个虚拟构造函数,Foobar::Foobar(long num, IDbService& db)所有的值(包括IDbService&)都很好.

MFC DLL和我的单元测试EXE都共享一个属性表,它应该保持编译器标志等效.我正在调试模式下构建并运行测试.任何想法为什么std::wstring不能跨DLL复制?

Mr.*_*C64 11

您应该检查EXE和DLL是否与相同的调试CRT(编译器选项)动态链接.确保EXE和DLL的其他设置相同./MDd_HAS_ITERATOR_DEBUGGING

(一种捷径可能只是使用const wchar_t*而不是std::wstring在类接口,而只是std::wstring从构造函数体内的原始指针构建一个).

编辑:您确认CRT不匹配(即使用内置的/MDDLL构建的EXE /MDd)是问题.事实是,相同的类名std::wstring在debug builds(/MDd)和release builds(/MD)中意味着两个不同的类.实际上,在调试版本中,类实现中可以有其他机制来帮助调试; 这种机制可能会导致效率低下,因此在发布版本中将其删除.因此,调试版本的内部结构std::wstring是从发行版本的不同std::wstring(例如,如果你尝试打印原料sizeofstd::wstring情况下,你可以找到不同的号码在发布版本和调试版本).因此,构建的EXE /MD期待发布版本std::wstring; 相反,构建的DLL /MDd期望调试构建std::wstring:这两个期望之间存在不匹配(一个模块期望类,X但另一个模块正在给类Y),所以你遇到了崩溃.