6

我已经在 Visual Studio 2010 中建立了一个项目来针对现有的 MFC DLL 编写单元测试。我正在使用单头单元测试框架,并从单元测试项目链接到 MFC DLL 的 lib 包装器。我正在尝试构建一个std::wstring在其构造函数中包含 a 的类。这是我的测试的样子:

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 导出的类在哪里。但是,测试框架报告了一个意外的异常。将字符串复制到 ' 的构造函数时,我将其跟踪到std::wstring' 的复制构造Foobar函数。MSVC 调试器将源字符串报告为<Bad Ptr>.

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

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

4

1 回答 1

12

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

(一个快捷方式可能是只使用const wchar_t*而不是std::wstring在类接口处,并且只是std::wstring从构造函数体内的原始指针构建一个)。

编辑:您确认 CRT 不匹配(即用 构建的 EXE 与用 构建的/MDDLL /MDd)是问题所在。事实上,相同的类名std::wstring在调试版本 ( /MDd) 和发布版本 ( /MD) 中意味着两个不同的类。事实上,在调试版本中,类实现中可以有额外的机制来帮助调试;这种机制可能会导致效率低下,因此在发布版本中已将其删除。因此,调试构建的内部结构std::wstring与发布构建的不同std::wstring(例如,如果您尝试打印实例的原始数据sizeofstd::wstring您可以在发布构建和调试构建中找到不同的数字)。因此,使用构建的 EXE/MD期望发布构建的std::wstring; 而是使用构建的 DLL/MDd期待 debug-build's std::wstring:这两个期望之间存在不匹配(一个模块期待 classX但另一个模块正在提供 class Y),所以你有一个崩溃。

于 2013-03-02T18:42:19.703 回答