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