MSVC CRT 入口函式

在 VS2008 安裝目錄的 crt/src/crt0.c:


入口函式為 __tmainCRTStartup


假使是 Windows 視窗程式:


#ifdef _WINMAIN_
STARTUPINFO StartupInfo;
GetStartupInfo( &StartupInfo );
#endif


STARTUPINFO 包含了 desktop 名稱、視窗 title、視窗位置等資訊,它最主要是用在等會呼叫 _tWinMain 時,用其中的 wShowWindow 屬性。


接下來執行:


check_managed_app()
檢查是否為 managed code,這會影響行程結束的方式


_heap_init()
初始化堆積,這邊呼叫 HeapCreate()


_mtinit()
初始化 multi-thread


_ioinit()
初始化 IO


GetCommandLineT()
取得 command line 參數


GetEnvironmentStringsT()
取得環境變數


_cinit()
初始化 C data


最後根據是 GUI process or console process 來呼叫不同的 main。


#ifdef _WINMAIN_
mainret = _tWinMain( (HINSTANCE)&__ImageBase,
                                 NULL,
                                 lpszCommandLine,
                                 StartupInfo.dwFlags & STARTF_USESHOWWINDOW
                                      ? StartupInfo.wShowWindow
                                      : SW_SHOWDEFAULT
                                );
#else
mainret = _tmain(__argc, _targv, _tenviron);
#endif


由 main 返回後,端看是否為 managed code,會呼叫不同的 exit 函式:


if ( !managedapp )
      exit(mainret);
_cexit();


其實兩個 exit 函式都是呼叫 doexit 函式,只是傳的參數不同。在 crt0dat.c 中可以看到差異:


exit = doexit(code, 0, 0); /* full term, kill process */
_cexit = doexit(0, 0, 1);    /* full term, return to caller */


由以上可知,在程式進入 main 之前,CRT 是需要做許多事情的,比如初始化程式會用到的 heap。


留言

熱門文章