簡體   English   中英

從DLL訪問沖突中提升測試用例

[英]boost test case from dll access violation

我想從Windows RT下的dll啟動Boost測試用例。 我使用以下命令通過Visual Studio命令提示符將測試用例構建為dll:

cl.exe / EHsc / D_USRDLL / D_WINDLL / LDd〜location \\ 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) Line 388 C++ TestApp.exe!boost::unit_test::framework::get(unsigned long id) Line 73 C++ TestApp.exe!boost::unit_test::traverse_test_tree(unsigned long id, boost::unit_test::test_tree_visitor & V) Line 232 C++ TestApp.exe!boost::unit_test::traverse_test_tree(const boost::unit_test::test_suite & suite, boost::unit_test::test_tree_visitor & V) Line 207 C++ TestApp.exe!boost::unit_test::traverse_test_tree(unsigned long id, boost::unit_test::test_tree_visitor & V) Line 234 C++ TestApp.exe!boost::unit_test::framework::run(unsigned long id, bool continue_test) Line 403 C++ TestApp.exe!boost::unit_test::unit_test_main(boost::unit_test::test_suite * (int, char * *) * init_func, int argc, char * * argv) Line 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);

有什么想法可以解決問題嗎?

檢查console_test_runner在做什么。 這是命令行應用程序(Boost.Test的一部分),旨在完成該任務-加載和執行在共享庫中實現的測試單元。 另外,請確保您告訴UTF您要構建dll:定義BOOST_TEST_DYN_LINK。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM