如何在exe中手动初始化c运行时?

时间:2017-03-08 10:38:18

标签: c++ visual-c++ googletest crt

我试图使用链接器开关" / entry"提供我自己的可视化c ++可执行文件的入口点。相关的Microsoft文档详细介绍了如何在dll中手动初始化c运行时,但我无法掌握如何在我的exe中初始化它。我得到的最好的是我需要调用_CRT_init,但我不知道这是一个函数还是一个宏,或者它可能被定义的地方,以及Visual Studio(和msbuild)是不是#39;识别标识符,所以没有提示。

这里的理由是,我尝试使用Google Test进行单元测试,这是一个可执行文件,并且由于main()冲突而无法链接。 GTest常见问题解答中提到的两种方法并不是很普遍,需要对大约30个遗留可执行文件进行大量修改才能实现。重命名每个单元测试应用程序的main()似乎是一种超级简单的方法,只要我能初始化c运行时。

3 个答案:

答案 0 :(得分:0)

所以我今天下午搜索了C Runtime来源,答案是“不”。如果要使用C运行时,则无法提供自己的名为main的可执行入口点。除了_CRT_INIT()是dll的初始化函数(mainCRTStartup()是可执行文件的初始化函数之一)之外,mainCRTStartup()和它的名称一样调用main()。 / p>

答案 1 :(得分:0)

  • 您可以在独立的包装器模块中初始化CRT 主要;的 OBJ1
  • 将所有现有exe模块的主体重命名为xx_main; obj2,obj3 .... objn
  • obj1(主要)(obj2,obj3 .... objn)相关联。
  

要测试foo.cc文件,您需要编译并将其链接到您的单元   测试程序

这个方案的问题是什么?

enter image description here

答案 2 :(得分:0)

尽管没有特别说明,但可以用与在DLL中相同的方式在可执行文件中初始化CRT。

EXTERN_C BOOL WINAPI _CRT_INIT( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved );

// ThreadProc for CreateRemoteThread, a possible use case.
DWORD WINAPI ArbitraryAlternateEntryPoint( LPVOID )
{
    _CRT_INIT( GetModuleHandle( NULL ), DLL_PROCESS_ATTACH, NULL );

    // CRT functions can be used here.

    _CRT_INIT( GetModuleHandle( NULL ), DLL_PROCESS_DETACH, NULL );

    return 0;
}

documentation建议,除了初始调用外,还应为每个新线程调用_CRT_INIT,但是实际上这不是必需的。