操作系統(tǒng)裝載應(yīng)用程序后,做完初始化工作就轉(zhuǎn)到程序的入口點(diǎn)執(zhí)行。程序的默認(rèn)入 口點(diǎn)由連接程序設(shè)置, 不同的連接器選擇的入口函數(shù)也不盡相同。在VC++下,連接器對(duì)控制臺(tái)程序設(shè)置的入口函數(shù)是 mainCRTStartup,mainCRTStartup 再調(diào)用main 函數(shù);對(duì)圖形用戶界面(GUI)程序設(shè)置的入口函數(shù)是 WinMainCRTStartup,WinMainCRTStartup 調(diào)用你自己寫(xiě)的 WinMain 函數(shù)。具體設(shè)置哪個(gè)入口點(diǎn)是由連接器的“/subsystem:”選項(xiàng)確定的,它告訴操作系統(tǒng)如何運(yùn)行編譯生成的.EXE文件??梢灾付ㄋ姆N方 式:CONSOLE|WINDOWS|NATIVE|POSIX。如果這個(gè)選項(xiàng)參數(shù)的值為 WINDOWS,則表示該應(yīng)用程序運(yùn)行時(shí)不需要控制臺(tái),有關(guān)連接器參數(shù)選項(xiàng)的詳細(xì)說(shuō)明請(qǐng)參考 MSDN 庫(kù)。
以下四種組合,可以實(shí)現(xiàn)console和windows模式的混合,可以達(dá)到不彈出DOS窗口的效果,也可以達(dá)到在Windows程序中向控制臺(tái)輸出printf信息的目的。
#pragma comment( linker, "/subsystem:windows /entry:WinMainCRTStartup" )
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
#pragma comment( linker, "/subsystem:console /entry:mainCRTStartup" )
#pragma comment( linker, "/subsystem:console /entry:WinMainCRTStartup" )
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// ...
}
int main(void)
{
// ...
}