Windows程式內部運行原理

來源:互聯網
上載者:User
因剛接觸VC++,對Windows程式的運行過程進行了複習,下面是對windows程式運行過程簡單的描述:
Windows應用程式,作業系統,電腦硬體之間的相互關係:

1、關於API
向下的箭頭③表示應用程式可以通知作業系統執行某個具體的動作,如作業系統能夠控制音效卡發出聲音,但它並不知道應該何時發出何種聲音,需要應用程式告訴作業系統該發出什麼樣的聲音。這個關係好比有個機器人能夠完成行走的功能,但是,如果人們不告訴它往哪個方向上走,機器人是不會主動行走的。這裡的機器人就是作業系統,人們就是應用程式。 那麼,應用程式是如何通知作業系統執行某個功能的呢?有過編程經驗的讀者都應該知道,在應用程式中要完成某個功能,都是以函數調用的形式實現的,同樣,應用程式也是以函數調用的方式來通知作業系統執行相應的功能的。作業系統所能夠完成的每一個特殊功能通常都有一個函數與其對應,也就是說,作業系統把它所能夠完成的功能以函數的形式提供給應用程式使用,應用程式對這些函數的調用就叫做系統調用,這些函數的集合就是Windows作業系統提供給應用程式編程的介面(Application Programming Interface),簡稱Windows API。如CreateWindow就是一個API函數,應用程式中調用這個函數,作業系統就會按照該函數提供的參數資訊產生一個相應的視窗。
2、關於訊息及訊息佇列
向上的箭頭④表示作業系統能夠將輸入裝置的變化上傳給應用程式。如使用者在某個程式活動時按了一下鍵盤,作業系統馬上能夠感知到這一事件,並且能夠知道使用者按下的是哪一個鍵,作業系統並不決定對這一事件如何作出反應,而是將這一事件轉交給應用程式,由應用程式決定如何對這一事件作出反應。好比有個蚊子叮了我們一口,我們的神經末梢(相當於作業系統)馬上感知到這一事件,並傳遞給了我們的大腦(相當於應用程式),我們的大腦最終決定如何對這一事件作出反應,如將蚊子趕走,或是將蚊子拍死。對事件作出反應的過程就是訊息響應。
作業系統是怎樣將感知到的事件傳遞給應用程式的呢?這是通過訊息機制(Message)來實現的。作業系統將每個事件都封裝成一個稱為訊息的結構體MSG來傳遞給應用程式,參看MSDN。
MSG結構定義如下:
typedef struct tagMSG {      
     HWND   hwnd;     
     UINT   message;
     WPARAM wParam;
     LPARAM lParam;
     DWORD  time;
     POINT  pt;
} MSG;
3、關於控制代碼
控制代碼(HANDLE),資源的標識。
作業系統要管理和操作這些資源,都是通過控制代碼來找到對應的資源。按資源的類型,又可將控制代碼細分成表徵圖控制代碼(HICON),游標控制代碼(HCURSOR),視窗控制代碼(HWND),應用程式執行個體控制代碼(HINSTANCE)等等各種類型的控制代碼。作業系統給每一個視窗指定的一個唯一的標識號即視窗控制代碼。
4、從變數的類型區分變數的用途

int x,y;
x=30; 
y=30;  
//x和y既可以用來表示座標點,也可以用來表示寬度和高度,還可以用來表示身高和體重。

typedef int WIDTH
typedef int HEIGHT
WIDTH x;
HEIGHT y;
//好處:我們從變數的類型上就可以知道x和y是用來表示寬度和高度。
5、WinMain函數
Windows程式的入口函數
int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
); 
6、表單的建立
建立一個完整的視窗需要經過下面四個操作步驟:
1.設計一個視窗類別;
2.註冊視窗類別;
3.建立視窗;
4.顯示及更新視窗。
設計表單類
typedef struct _WNDCLASS {
   UINT     style;
   WNDPROC lpfnWndProc;
   int      cbClsExtra;
   int      cbWndExtra;
   HANDLE  hInstance;
   HICON    hIcon;
   HCURSOR  hCursor;
   HBRUSH   hbrBackground;
   LPCTSTR  lpszMenuName;
   LPCTSTR  lpszClassName; 
} WNDCLASS;
7、表單類的類型
在我們的程式中經常要用到一類變數,這個變數裡的每一位(bit)都對應某一種特性。當該變數的某位為1時,表示有該位對應的那種特性,當該位為0時,即沒有該位所對應的特性。當變數中的某幾位同時為1時,就表示同時具有幾種特性的組合。一個變數中的哪一位代表哪種意義,不容易記憶,所以我們經常根據特徵的英文拼字的大寫去定義一些宏,該宏所對應的數值中僅有與該特徵相對應的那一位(bit)為1,其餘的bit都為0。我們使用goto definition就能發現CS_VREDRAW=0x0001,CS_HREDRAW=0x0002,CS_DBLCLKS =0x0008,CS_NOCLOSE=0x0200。他們的共同點就是只有一位為1,其餘位都為0。如果我們希望某一變數的數值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我們只需使用二進位OR(|)操作符將他們進行或運算相組合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我們希望在某一變數原有的幾個特徵上去掉其中一個特徵,用取反(~)之後再進行與(&)運算,就能夠實現,如在剛才的style的基礎上去掉CS_NOCLOSE特徵,可以用style & ~CS_NOCLOSE實現。
8、表單過程函數
第二個成員變數lpfnWndProc指定了這一類型視窗的過程函數,也稱回呼函數。回呼函數的原理是這樣的,當應用程式收到給某一視窗的訊息時(還記得前面講過的訊息通常與視窗相關的嗎?),就應該調用某一函數來處理這條訊息。這一調用過程不用應用程式自己來實施,而由作業系統來完成,但是,回呼函數本身的代碼必須由應用程式自己完成。對於一條訊息,作業系統到底調用應用程式中的哪個函數(回呼函數)來處理呢?作業系統調用的就是接受訊息的視窗所屬的類型中的lpfnWndProc成員指定的函數。每一種不同類型的視窗都有自己專用的回呼函數,該函數就是通過lpfnWndProc成員指定的。
 舉例:汽車廠家生產汽車好比應用程式建立視窗,使用者使用汽車好比作業系統管理視窗,某種汽車在銷售前就指定好了修理站(類似回呼函數),當使用者的汽車出現故障後(類似視窗收到訊息),汽車使用者(類似作業系統)自己直接找到修理站去修理,不用廠家(類似應用程式)親自將車送到修理站去修理,但修理站還得由廠家事先建造好。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.