windows核心程式設計--windows程式的執行

Mobidogs發表於2020-04-04
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
 
 
 
 

相關文章