Ho impostato un progetto in Visual Studio 2010 per scrivere test di unità su una DLL MFC esistente. Sto usando un framework di test unit testata singola e collegato al wrapper lib della DLL MFC dal progetto di test dell'unità. Sto provando a costruire una classe che prende uno std::wstring
nel suo costruttore. Ecco ciò che il mio test assomiglia:Impossibile passare std :: wstring su DLL
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);
}
Dove Foobar
è la classe esportata dalla DLL MFC in prova. Tuttavia, il framework di test riporta un'eccezione imprevista. Ho rintracciato il costruttore di copie di std::wstring
quando copiavo la stringa nel costruttore di Foobar
. Il debugger MSVC segnala la stringa di origine come <Bad Ptr>
.
Ho creato un costruttore fittizio, Foobar::Foobar(long num, IDbService& db)
e tutti i valori (incluso lo IDbService&
) si presentano perfettamente.
Sia la DLL MFC che il mio test di unità EXE condividono un foglio di proprietà che dovrebbe mantenere i flag del compilatore equivalenti. Sto costruendo ed eseguendo il test in modalità di debug. Qualche idea per cui lo std::wstring
non può copiare attraverso la DLL?
È possibile collegare in modo dinamico sia l'EXE che la DLL con la versione di debug del CRT? ('/ MDd') –
@ Mr.C64 Wow, era così. Il mio progetto di test unitario utilizzava '/ MD' e la DLL MFC era'/MDd'. Mi piacerebbe una breve spiegazione come risposta in modo che io possa capirlo; e lo accetterò. Grazie! –
Ho aggiunto una breve spiegazione. Fondamentalmente, penso che il problema nel tuo caso sia che 'std :: wstring' di debug-build ha un'implementazione diversa rispetto a' std :: wstring' di release-build. –