Windows程式的生命週期

2021-07-14 23:13:51 字數 1807 閱讀 2144

幾年前曾經看過侯俊傑老師的《mfc深入淺出》,覺得這本書對mfc的講解比較深入,由淺入深,對c++的基礎、windows程式的基礎、mfc的原理等講的都比較好。通過幾年的工作學習,我對mfc的理解也有了進一步的提高,想再去看一遍這本書,最近看了第一章,就想寫點東西來增加自己的理解,也順便開始我的部落格之旅。我的第一篇文章,想談談windows程式的開始和結束。

每當我們雙擊桌面上的應用程式圖示時,windows的shell程式(我的理解可能類似於windows的任務管理器之類,檢測使用者的動作)就會建立乙個程序,就像我們在程式中顯式呼叫createprocess一樣,但是這時程式並沒有真正執行起來。首先,系統會為建立的程序分配記憶體空間,一般32位的機器上都是4gb,用於引導程式的資料、**以及相關的依賴庫檔案。在這4g的位址空間中,有2g的空間是程序獨有的,即每個程序的2g空間不相干擾、互不能訪問,另外2g空間用於載入windows核心程式,這些是每個程序共享的。在這之後,系統會呼叫c runtime庫中的startup**,並在其中呼叫應用程式的main或者winmain函式,我的理解應該是程序執行環境準備好後,c runtime的startup**會建立乙個主線程,這樣main或winmain函式就會執行在主線程中了。

每乙個win32程式都有乙個winmain函式,這相當於控制台程式的main函式,是我們自己寫的**的入口點,雖然它並不是程式被呼叫的第乙個函式。進入winmain函式後程式需要呼叫registerclass註冊乙個視窗類,這應該是告訴系統視窗的名稱、型別、大小等屬性,是描述win32程式的類,而顯示出來的視窗只是這個類的乙個例項。註冊視窗時必須要提供乙個「視窗函式」的指標給系統,由於windows程式是靠訊息和事件驅動的,所以必須要告訴系統,該類視窗的訊息由誰處理的。視窗類註冊成功後,就需要呼叫createwindow和showwindow函式去建立和顯示視窗了。建立視窗時,系統會傳送wm_create訊息給視窗,這樣程式在視窗建立成功後有機會做一些初始化的操作。顯示視窗時,系統也會傳送wm_paint訊息,這樣程式就能夠控制如何顯示視窗。

接下來的事情就等待使用者輸入並處理使用者輸入了。「輸入」有可能來自鍵盤、滑鼠等硬體動作,也有可能來自系統或其他程式傳送過來的訊息,它們都由系統的user模組進行捕獲,我們在呼叫getmessage或peekmessage時會得到這些訊息。當獲得乙個訊息後,需要呼叫translatemessage將硬體動作或其他動作轉換為通用的msg訊息,然後呼叫dispatchmessage分發訊息。dispatchmessage會通過user模組將訊息傳送給視窗函式,由於程式註冊視窗類(registerclass)時已經提供了視窗函式的指標,所以系統能夠根據視窗的型別很方便的呼叫視窗函式。一開始我會想,為什麼這裡不是直接呼叫訊息處理函式(視窗函式)去處理訊息呢?我想這應該mfc的「框架」特性了,它封裝了一些通用的操作,而無需每個視窗都要進行重複的操作。將視窗函式通過指標提交給系統,系統有機會在訊息被處理之前做一些其他操作,另外,不一定只有程式本身會呼叫視窗函式,系統可能會在其他一些情況下呼叫它。

當使用者關閉視窗時,系統會傳送wm_close訊息,如果程式需要在視窗關閉之前做一些事,如提示使用者即將退出等,就需要在視窗函式中攔截這個訊息,否則呼叫destroywindow函式或直接交由系統的預設視窗函式即可。系統在銷毀視窗之前會傳送wm_destroy訊息,程式必須在收到這個訊息時呼叫postquitmessage傳送wm_quit訊息,通知系統程式可以退出,否則視窗雖然銷毀了,但是程序卻沒有退出。當然我們也可以在wm_destroy訊息中處理一些其他事情,如釋放資源等操作。

程序退出後,控制權會回到c runtime的startup**中,我想它應該會呼叫exitthread退出主線程。之後系統會呼叫exitprocess退出進出,至此,乙個程式的執行就算結束了。

本文出自 「jsl_mes」 部落格,請務必保留此出處

小程式 生命週期

page 生命週期函式 監聽頁面載入 onload function options 生命週期函式 監聽頁面初次渲染完成 onready function 生命週期函式 監聽頁面顯示 onshow function 生命週期函式 監聽頁面隱藏 onhide function 生命週期函式 監聽頁面解...

iOS 程式生命週期

狀態名解釋 not running 應用還沒啟動或者應用發生中斷 inactive 應用正在前台執行 不接收事件 active 應用正在前台執行 接收事件 background 應用處於後台執行 程式在後台而且能執行 大多數程式進入這個狀態後會在在這個狀態上停留一會。時間到之後會進入掛起狀態 sus...

小程式生命週期

小程式分為應用 頁面和元件三個部分,所以小程式的生命週期涉及以下 onlaunch function options onshow function options onhide function onerror function msg onpagenotfound function res gl...