天天看點

深入淺出MFC--第一章

Windows程式的生與死

當使用者按下系統菜單中的Close指令項,系統送出WM_CLOSE。通常程式的視窗函數不攔截次消息,于是DefWindowProc函數處理它。DefWindowProc收到WM_CLOSE後,調用DestoryWindow把視窗清除。DestroyWindow本身又會送出WM_DESTROY。程式對WM_DESTROY的标準反應是調用PostQuitMessage。PostQuitMessage沒什麼其它動作,就隻送出WM_QUIT消息,準備讓消息循環退出。

空閑時間的處理:OnIdle

所謂空閑時間(Idle time),是指【系統中沒有任何消息等待處理】的時間。舉個例子,沒有任何程式使用定時器(timer,它會定時送來WM_TIMER),使用者也沒有碰觸鍵盤和滑鼠或任何外圍裝置,那麼,系統就處在所謂的空閑時間。

空閑時間常常發生。不要認為你移動滑鼠時産生了一大堆的WM_MOUSEMOVE,事實上夾雜在每一個WM_MOUSEMOVE之間就可能存在許多空閑時間。畢竟,計算機速度超乎想象。

背景工作最适宜在空閑時間完成。傳統的SDK程式如果要處理空閑時間,可以以下列循環取代WinMain中傳統的消息循環:

1 while(TRUE)
 2 {
 3     if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 4     {
 5         if(msg.message == WM_QUIT)
 6         {
 7             break;
 8         }
 9         TranslateMessage(&msg);
10         DispatchMessage(&msg);
11     }
12     else
13     {
14         OnIdle();
15     }
16 }      

原因是PeekMessage和GetMessage的不同,GetMessage是阻塞的,而PeekMessage是非阻塞的。

Console程式和DOS程式的差別

console程式是指在Windows下開發的不實用UI的控制台程式

dos程式是指在dos系統下開發的程式

一個程序的誕生與死亡

執行一個程式就必然産生一個程序。最直接的程式執行方式是在shell中即資料總管找那個以滑鼠輕按兩下某個可執行檔案的圖示,執行起來的App程序其實是shell調用CreateProcess激活的。

讓我們看看整個流程:

1、shell調用CreateProcess激活App.exe。

2、系統産生一個【程序核心對象】,計數值為1。

3、系統為此程序建立一個4GB的位址空間。

4、加載器将必要的碼加載到上述位址空間中,包括App.exe的程式、資料,以及所需的動态連結庫。加載器如何知道要加載哪些dll呢?它們被記錄在可執行檔案的.idata section中。

5、系統為此程序建立一個執行線程,稱為主執行線程(primary thread)。執行線程才是CPU時間的配置設定對象。

6、系統調用C runtime函數庫的startup code。

7、startup code調用App程式的WinMain函數。

8、App程式開始運作。

9、使用者關閉App主視窗,使WinMain中的消息循環結束掉,于是WinMain結束。