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。
留言
張貼留言