深入剖析wtl——win32模型
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應用程式模型
入口函式就是程式的主線程的執行起點。
這裡討論的開發框架(framework)是針對視窗介面程式的。
視窗介面程式通常分成以下幾類:sdi, mdi, multi-sdi, 和dialog應用程式。
sdi(single document inte***ce)應用程式通常只有乙個主視窗(通常是乙個框架視窗,frame window)。框架視窗包含選單、工具欄、狀態列和稱為視(view)的客戶工作區。
multi-sdi(multiple threads sdi)應用程式有框架個主視窗。比如ie瀏覽器,使用"檔案/新建/視窗"命令後,會出現另乙個ie視窗。
mdi(multiple document inte***ce)應用程式有乙個主框架視窗,但有多個子框架視窗。每個子視窗都有自己的視(view)。
dialog應用程式是基於對話方塊的。
通常乙個簡單的sdi應用程式由兩個函式組成。乙個是應用程式入口函式winmain(),另乙個是該應用程式視窗的視窗函式。
程式(主線程)從入口函式開始執行。在該函式中,首先是註冊並建立乙個主視窗。然後,啟動訊息迴圈。訊息迴圈中,根據不同的訊息,將訊息傳送到視窗函式中處理。當訊息是退出訊息時,該入口函式會退出訊息迴圈,然後結束程式。
下面是乙個最簡單的windows介面應用程式。
上面程式的執行過程如下:
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 是windows template library的縮寫。最初,wtl是由微軟的atl active template library 小組成員開發的乙個sdk例子。主要是基於atl的對win32 api的封裝。從2.0後,功能逐步完善,成為了乙個完整的支援視窗的框架 windows fra...
深入剖析C 繼承機制3
三.訪問與隱藏基類成員 1 訪問基類成員 通過base 關鍵字訪問基類的成員 呼叫基類上已被其他方法重寫的方法。指定建立派生類例項時應呼叫的基類建構函式。基類訪問只能在建構函式 例項方法或例項屬性訪問器中進行。從靜態方法中使用 base 關鍵字是錯誤的。示例 下面程式中基類 person 和派生類 ...
PGA深入剖析
pga pga系統全域性區 program global area 程序全域性區 process global area pga是乙個記憶體區域,該區域包含了一些與某個特定伺服器程序相關的資料和控制資訊,每個程序都有自己的私有pga區,所以這塊區域只能被其所屬程序進入,而不能被其他程序訪問,所以在p...