【发布时间】:2013-02-17 03:28:54
【问题描述】:
我在 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);
}
其中Foobar 是从被测 MFC DLL 导出的类。但是,测试框架报告了一个意外的异常。在将字符串复制到Foobar 的构造函数时,我将其追踪到std::wstring 的复制构造函数。 MSVC 调试器将源字符串报告为<Bad Ptr>。
我创建了一个虚拟构造函数Foobar::Foobar(long num, IDbService& db),所有值(包括IDbService&)都可以正常显示。
MFC DLL 和我的单元测试 EXE 都共享一个属性表,该属性表应该保持编译器标志相同。我正在调试模式下构建和运行测试。任何想法为什么std::wstring 不能跨 DLL 复制?
【问题讨论】:
-
您是否将 EXE 和 DLL 与 CRT 的调试版本动态链接? (
/MDd) -
@Mr.C64 哇,就是这样。我的单元测试项目使用
/MD,而MFC DLL 是/MDd。我想要一个简短的解释作为答案,以便我能理解它;我会接受的。谢谢! -
我添加了一个简短的解释。基本上,我认为您的问题是 debug-build 的
std::wstring与 release-build 的std::wstring具有不同的实现。
标签: c++ visual-studio-2010 visual-c++ dll