學習C++與.net不同的是,一定要搞清楚Windows程序內部運行原理,因為他所涉及大多數是操作系統的調用,而.net畢竟是在.netFrameWork上唱戲。
那Windows應用程序,操作系統,計算機硬件之間的相互關系究竟什麼了,下面的圖就給予很好的解釋。
向下箭頭①是 應用程序運行判斷處理的結果,輸出到輸出的設備。
向上箭頭②是輸入設備,輸入到操作系統中。
向下箭頭③代表API,我們要解釋以下API是什麼。API是應用程序接口, 表示應用程序可以通知操作系統執行某個具體的動作,如操作系統能夠控制聲卡發出聲音,但它並不知應該何時發出何種聲音,需要應用程序告訴操作系統該發出什麼樣的聲音。這個關系好比有個機器人能夠完成行走的功能,但是,如果人們不告訴它往哪個方向上走,機器人是不會主動行走的。這裡的機器人就是操作系統,人們就是應用程序。 對程序員來說,就可以理解為可以調用函數庫,C++程序員是對操作系統的同用。Java中調用的API是jdk中提供的函數庫,而。net程序員則是.netframework提供的函數庫。
向上的箭頭④表示操作系統能夠將輸入設備的變化上傳給應用程序。如用戶在某個程序活動時按敲了一下鍵盤,操作系統馬上能夠感知到這一事件,並且能夠知道用戶按下的哪一鍵,操作系統並不決定對這一事件如何作出反應,而是將這一事件轉交給應用程序,由應用程序決定如何對這一事件作出反應。好比有個司機開車看見前面遇到一輛車,我們的神經末梢(相當於操作系統)馬上感知到這一事件,並傳遞給了我們的大腦(相當於應用程序),我們的大腦最終決定如何對這一事件作出反應,如將踩剎車,停下來,或是英勇撞上去(則是一個sb做法)。對事件作出反應。
操作系統是怎樣將感知到的事件傳遞給應用程序的呢?這是通過消息機制(Message)來實現的。操作系統將每個事件都包裝成一個稱為消息的結構體MSG來傳遞給應用程序,參看MSDN。
MSG結構定義如下:
typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;的過程就是消息響應。
其實,寫在這裡,作為一個做過3年.net開發人員。我這裡有感而發,C++是如此,.net事件響應的機制。何嘗不是一個消息機制。 消息機制,是程序界一大質的飛躍,而也是這種消息機制,把.net程序員的控件封裝太死, 也造就一大批只能拖控件的程序員。 我學了C++還是真的有一種豁然開朗的感覺。.net程序員,還是多看點C++吧!