深入剖析WTL Win32模型

2021-03-31 08:56:58 字數 1816 閱讀 2022

wtl 是windows template library的縮寫。最初,wtl是由微軟的atl(active template library)小組成員開發的乙個sdk例子。主要是基於atl的對win32 api的封裝。從2.0後,功能逐步完善,成為了乙個完整的支援視窗的框架(windows framework)。

與mfc相比較,功能並沒有mfc完善。比如mfc支援doc/view架構,而wtl並不支援。同時,wtl也沒有microsoft的官方支援。但是,wtl是基於模版(template)的,其應用程式最小只有24kb,同時不象mfc,依賴dll(mfc需要mfc42.dll)。

wtl系列文章對wtl進行了深入剖析,希望能方便您對wtl有乙個深入的理解,從而能得心應手的開發出高質量的windows應用程式。

win32的執行緒模型

為了便於以後的**,首先看一下win32的執行緒模型。

乙個win32應用程式(或程序)是由乙個或多個併發的執行緒組成的,其中第乙個啟動的執行緒稱為主線程。

win32定義了兩種型別的執行緒,介面執行緒和工作執行緒。win32的每個程序可以有乙個或多個介面執行緒和/或多個工作執行緒。介面執行緒擁有乙個或多個視窗,擁有乙個訊息佇列和其它屬於介面執行緒的元素。工作執行緒就是一般的執行緒,它沒有視窗,沒有訊息佇列。

介面執行緒通常有乙個或幾個視窗。當某乙個視窗有訊息時,介面執行緒會呼叫相應的視窗函式(windows process)來處理該事件。由於某訊息迴圈由它介面執行緒處理,同時不必在乎是哪個執行緒傳送訊息的,因此,windows會保證執行緒間的同步問題。

對於工作執行緒,執行緒間的同步必須由程式設計師來實現。盡可能避免死鎖和競爭出現。

win32應用程式模型

int apientry winmain(hinstance hinstance,

hinstance hprevinstance,

lpstr lpcmdline,

int ncmdshow)

return msg.wparam;

}//視窗函式

lresult callback wndproc(hwnd hwnd,

uint message,

wparam wparam,

lparam lparam)

return 0;

}

上面程式的執行過程如下:

1、註冊視窗類

在使用createwindwo()或createwindowex()建立視窗時,必須提供乙個標識視窗類的字串。該視窗類定義了一些視窗的基本屬性。其中乙個重要的工作是向作業系統提供視窗函式。該函式是**函式,用於處理傳送給該視窗的訊息。

在上面程式中,僅僅簡單的處理了兩個訊息。乙個是向視窗區域畫出"hello world."字串。另乙個是當視窗撤消時,向應用程式傳送"退出應用程式"訊息。

2、建立視窗

3、顯示視窗

4、啟動訊息迴圈,分發並處理訊息。

while (getmessage(&msg, null, 0, 0)) 

在上述訊息迴圈**中,呼叫getmessage()從執行緒的訊息佇列中取出一條訊息。如果訊息為0(由視窗函式處理"wm_destroy"訊息時傳送的"postquitmessage(0)"),會退出訊息迴圈。

然後呼叫translatemessage()翻譯訊息。

翻譯後,再呼叫dispatchmessage()將該訊息分發至相應的視窗函式進行處理。 (實際上dispatchmessage()將該訊息作為引數呼叫對應的視窗的視窗函式,這就是分發的實質)。

深入剖析WTL Win32模型

深入剖析wtl win32模型 wtl 是windows template library的縮寫。最初,wtl是由微軟的atl active template library 小組成員開發的乙個sdk例子。主要是基於atl的對win32 api的封裝。從2.0後,功能逐步完善,成為了乙個完整的支援視...

深入剖析C 繼承機制3

三.訪問與隱藏基類成員 1 訪問基類成員 通過base 關鍵字訪問基類的成員 呼叫基類上已被其他方法重寫的方法。指定建立派生類例項時應呼叫的基類建構函式。基類訪問只能在建構函式 例項方法或例項屬性訪問器中進行。從靜態方法中使用 base 關鍵字是錯誤的。示例 下面程式中基類 person 和派生類 ...

PGA深入剖析

pga pga系統全域性區 program global area 程序全域性區 process global area pga是乙個記憶體區域,該區域包含了一些與某個特定伺服器程序相關的資料和控制資訊,每個程序都有自己的私有pga區,所以這塊區域只能被其所屬程序進入,而不能被其他程序訪問,所以在p...