0

Windows RT で dll から Boost テスト ケースを開始したいと考えています。次のコマンドラインを使用して、Visual Studio コマンド プロンプトからテスト ケースを dll としてビルドしました。

cl.exe /EHsc /D_US​​RDLL /D_WINDLL /LDd ~場所\testcase.cpp ~ライブラリの場所\libboost_unit_test_framework-vc110-mt-sgd-1_53.lib /link /DLL /OUT:~出力ディレクトリ\testcase.dll

アプリケーションのフォルダーに配置し、プロパティ「Content」を「true」に設定しました。アプリケーションを起動した後、次のエラーが表示されます。

TestApp.exe の 0x00B9AF16 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000000

コール スタックのトップは次のとおりです。

> TestApp.exe!boost::unit_test::framework::get(unsigned long id, boost::unit_test::test_unit_type t) 388 行 C++ TestApp.exe!boost::unit_test::framework::get(unsigned long id) 73 行目 C++ TestApp.exe!boost::unit_test::traverse_test_tree(unsigned long id, boost::unit_test::test_tree_visitor & V) 行 232 C++ TestApp.exe!boost::unit_test::traverse_test_tree(const boost::unit_test::test_suite & suite, boost::unit_test::test_tree_visitor & V) 207 行 C++ TestApp.exe!boost::unit_test::traverse_test_tree(unsigned long id, boost::unit_test::test_tree_visitor & V) 行 234 C++ TestApp.exe!boost::unit_test::framework::run(unsigned long id, bool continue_test) 行 403 C++ TestApp.exe!boost::unit_test::unit_test_main(boost::unit_test::test_suite * (int, char * *) * init_func, int argc, char * * argv) 185 行目 C++

これがdllコードです(注:同じコードをソースに直接配置すると、正常に動作します):



    void test_stat()
    {
        //some code there
    }
    
    extern "C" {
        __declspec (dllexport) test_suite* init_unit_test_suite( int argc, char* argv[] )
        {
            test_suite *test = BOOST_TEST_SUITE("test name");
            test->add(BOOST_TEST_CASE(&test_stat));
            return test;
        }
    }

テスト ケースを起動するためのアプリケーションのコード:



    boost::unit_test::test_suite* main_global_test_suite;
    
    test_suite* init_unit_test_suite( int argc, char* argv[] ) {
        return NULL; }
    
    test_suite*  run_global_test_suite (int, char* []) {
        return main_global_test_suite;
    }
    
        HINSTANCE hMyDll;
        typedef test_suite* (*PFN_MyFunction)(int,const char*);
        PFN_MyFunction pfnMyFunction;
        test_suite* rPtr;
    
        if((hMyDll=::LoadPackagedLibrary(L"testcase", 0))==NULL) 
        {
            return; 
        }
        pfnMyFunction=(PFN_MyFunction)GetProcAddress(hMyDll,"init_unit_test_suite");
    
        if (pfnMyFunction != NULL)
        {
        //just create fake arguments for the boost::unit_test::unit_test_main function call
                char* argv[1024];
                    argv[0] = "Text";
    
                rPtr = pfnMyFunction(1, NULL);
                main_global_test_suite = rPtr;
    
                    const int error =
        boost::unit_test::unit_test_main(&run_global_test_suite, 1, argv );
        }
        else
        {
                //handling code
        }
        FreeLibrary(hMyDll);

問題を解決する方法はありますか?

4

1 に答える 1

0

console_test_runner が何をしているかを確認してください。これはコマンド ライン アプリケーション (Boost.Test の一部) であり、共有ライブラリに実装されたテスト ユニットをロードして実行することを目的としています。また、DLL をビルドすることを UTF に伝えてください: BOOST_TEST_DYN_LINK を定義してください。

于 2013-06-04T18:08:28.907 に答える