Windows
應(yīng)用程序的執(zhí)行
?
Windows
支持兩種類型的應(yīng)用程序。一種是基于圖形用戶界面(
GUI
)的應(yīng)用程序,另一種是基于控制臺用戶界面(
CUI
)的應(yīng)用程序。
(
兩者間可以相互轉(zhuǎn)化
,
沒有明確的界限
,
就是說可以讓
CUI
程序中可以有
Dialog
界面等
,
而
GUI
界面中也可以有
console
來輸出信息
)
?
對于一個應(yīng)用程序:
一
操作系統(tǒng)實際上先調(diào)用的是C / C + +運行期啟動函數(shù)。該函數(shù)負責對C / C + +運行期庫進行初始化,這樣,就可以調(diào)用m a l l o c 和f r e e 之類的函數(shù)。它還能夠確保已經(jīng)聲明的任何全局對象和靜態(tài)C + +對象能夠在代碼執(zhí)行以前正確地創(chuàng)建。鏈接程序負責在它連接可執(zhí)行文件時選擇相應(yīng)的C / C + +運行期啟動函數(shù)。如果設(shè)定了/ S U B S Y S T E M : W I N D O W S 鏈接程序開關(guān),那 么該鏈接程序期望找到一個Wi n M a i n 或w Wi n m a i n函數(shù)。如果這兩個函數(shù)都不存在,鏈接程序便返回一個“未轉(zhuǎn)換的外部符號”的錯誤消 息。否則,它可以分別選擇Wi n M a i n C RT S t a r t u p 函數(shù)或w Wi n M a i n C RT S t a r t u p 函數(shù)。
啟動函數(shù)的功能歸納如下:
?
檢索指向新進程的完整命令行的指針。
?
檢索指向新進程的環(huán)境變量的指針。
?
對
C / C + +
運行期的全局變量進行初始化。如果包含了
S t d L i b . h
文件,代碼就能訪問這些變量。表
4 - 1
列出了這些變量。
?
對
C
運行期內(nèi)存單元分配函數(shù)(
m a l l o c
和
c a l l o c
)和其他低層輸入
/
輸出例程使用的內(nèi)存棧進行初始化。
?
為所有全局和靜態(tài)
C + +
類對象調(diào)用構(gòu)造函數(shù)。
二
當所有這些初始化操作完成后,
C / C + +
啟動函數(shù)就調(diào)用應(yīng)用程序的進入點函數(shù)。如果編寫了一個
w Wi n M a i n
函數(shù),它將以下面的形式被調(diào)用
:
GetStartupInfo(&StartupInfo);
int nMainRetVal = wWinMain(GetMjduleHandle(NULL),
NULL, pszCommandLineUnicode,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW) ?
StartupInfo.wShowWindow:SW_SHOWDEFAULT);
?
三
當進入點函數(shù)返回時,啟動函數(shù)便調(diào)用
C
運行期的
e x i t
函數(shù),將返回值(
n M a i n R e t Va l
)傳遞給它。
E x i t
函數(shù)負責下面的操作:
?
調(diào)用由
_onexit
函數(shù)的調(diào)用而注冊的任何函數(shù)。
?
為所有全局的和靜態(tài)的
C++
類對象調(diào)用析構(gòu)函數(shù)。
?
調(diào)用操作系統(tǒng)的
ExitProcess
函數(shù),將
nMainRetVal
傳遞給它。這使得該操作系統(tǒng)能夠撤消進程并設(shè)置它的
e x i t
代碼。
?
附錄
:
各種應(yīng)用程序的進入點及對應(yīng)的啟動函數(shù)
?
應(yīng)用程序類型
|
進入點
|
嵌入可執(zhí)行文件的啟動函數(shù)
|
需要ANSI字符和字符串的GUI應(yīng)用程序
|
WinMain
|
WinMainCRTStartup
|
需要Unicode字符和字符串的GUI應(yīng)用程序
|
wWinMainw
|
WinMainCRTStartup
|
需要ANSI字符和字符串的CUI應(yīng)用程序
|
main
|
mainCRTStartup
|
需要Unicode字符和字符串的CUI應(yīng)用程序
|
wmain
|
wmainCRTStartup
|
?
?