CUI是console uers interface,GUI是graphical user interface,顧名思義,一個是基於控制台的,一個是基於視窗的。所謂的控制台,其實是一種文本,所以,控制台程式也就是基於文本的應用程式。說起應用程式,就不得不說進程,一個應用程式的執行個體(也就是運行著的應用程式)就是一個進程,所謂進程,其實也是一個空架子,它由一個記錄該進程的核心對象和一個存放可執行檔所有代碼和資料以及動態記憶體分配的地址空間。有了這樣的資訊,作業系統才可以有效地管理進程,有了這樣的地址空間,才可以在進程中啟動線程。這裡說到線程,其實線程才是真正的執行代碼的核心,而進程只是提供了一個孕育的環境,進程是有惰性的,當一個進程啟動時,必須有第一個線程啟動,這個線程叫主線程,如果願意,再由主線程啟動一級,二級以及多級的子線程。同樣,當進程中所有線程都退出時,進程也就結束了自己的生命。有了這些我們就可以討論一下CUI和GUI的區別之處了。
大家都知道,windows應用程式都要有一個入口函數,CUI是main,而GUI是winmain,也正是因為這樣的不同入口,區分了CUI和GUI。說到入口,就應該有這樣的疑問“入口之前是什嗎?”其實,在進入入口之前,首先執行的是作業系統的載入程式,而這個載入程式通過檢查可執行檔映像的檔案頭,來連結適當的入口函數,同時,對CUI和GUI進行明顯的區分:對於CUI程式載入程式自動確保有一個可用的文本控制台,而對於GUI程式就僅僅是將其載入。這就是說,你希望實現什麼類型的應用程式,就給怎樣的連結資訊(LINKER->SUBSYSYEM裡可以指定)。需要特別注意的是,經過連接器的指示,作業系統去調用入口函數了,可你萬萬沒有想到,此時,你的main或者winmain其實依然沒有被調用,實際上,此時的連接器指示的是作業系統調用的C/C++運行庫中的啟動函數,剛才說了應用程式有CUI和GUI之分,同理,在C/C++運行庫中,同樣有兩個版本的啟動函數,winmainCRTStartup
和 mainCRTStartup(其實是四個,另外兩個是用為unicode,這兩個是ansi,道理依然,這裡不再贅述),
而這兩個函數才是真正的導火線,他們將針對進行一些列的設定:
1.擷取進程命令列參數的指標和進程環境變數的指標;
2.初始化C/C++運行庫的全域變數;(這也是為什麼你只要在自己的代碼中包含了stdlib就可以用_osver的原因)
3.初始化記憶體配置函數(malloc,calloc)
4.調用所有全域的和靜態C++類對象的建構函式。
5.進入使用者的入口。(CUI:main,GUI:winMain)
看windows核心編程的總結,對windows應用程式的來龍去脈更加瞭解了。share to all!