6

Visual Studio 2010で、既存のMFCDLLに対して単体テストを作成するプロジェクトを設定しました。シングルヘッダーの単体テストフレームワークを使用しており、単体テストプロジェクトからMFCDLLの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テスト対象のMFCDLLからエクスポートされたクラスはどこにありますか。ただし、テストフレームワークは予期しない例外を報告します。std::wstring文字列を'sコンストラクターにコピーするときに、'scopyコンストラクターまで追跡しましたFoobar。MSVCデバッガーは、ソース文字列をとして報告します<Bad Ptr>

ダミーのコンストラクターを作成しましたがFoobar::Foobar(long num, IDbService& db)、すべての値(を含むIDbService&)は問題なく検出されます。

MFC DLLと単体テストEXEの両方が、コンパイラフラグを同等に保つ必要があるプロパティシートを共有しています。テストをビルドしてデバッグモードで実行しています。std::wstringDLLを越えてコピーできない理由はありますか?

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)で2つの異なるクラスを意味します。実際、デバッグビルドでは、デバッグを支援するためにクラス実装内に追加のメカニズムが存在する可能性があります。このメカニズムは非効率をもたらす可能性があるため、リリースビルドでは削除されています。そのため、デバッグビルドの内部構造はstd::wstringリリースビルドとは異なりstd::wstringます(たとえば、インスタンスのrawを印刷しようとするとsizeofstd::wstringリリースビルドとデバッグビルドで異なる番号を見つけることができます)。したがって、でビルドされたEXE/MDはrelease-buildを期待していましたstd::wstring。代わりに、で構築されたDLL/MDddebug-buildを期待していましstd::wstringた:これら2つの期待の間に不一致があり(一方のモジュールはクラスを期待していXますが、もう一方のモジュールはクラスを提供Yしています)、クラッシュが発生します。

于 2013-03-02T18:42:19.703 に答える