• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            系統理解Win32 API和MFC(下)

            系統理解Win32 API和MFC(下)
            作者: 溫昱
            作者主頁: lcspace.diy.163.com

            系統理解Win32 API和MFC(上)

            二、MFC的概念模型

            前面我們研究了WIN32 API的“領域模型”,對它有較全面的認識。下面,對MFC概念模型的研究,我們把重點放在對app framework的研究上。
            app framework中的message響應/傳遞機制是最重要的。而Hook機制和Message響應/傳遞機制是密切相關的,后者以前者為基礎。

            1. Hook機制

            也許有些程序員只知道hook機制可以編寫很“牛”的應用,孰不知MFC本身也是依靠hook機制的。

            從圖中看到,每個hook擁有一個指針隊列,每個指針指向一個稱為的HookProc函數,HookProc將在合適的時機被OS調用執行。hook是分不同種類的,其實正是hook的種類決定了它什么時機被OS調用執行。提示,可以看一下“訂閱-發布”設計模式以助理解。

            2 MFC中Message響應函數的安裝

            2.1 回憶API中Message響應函數的安裝

            API中Message響應函數的安裝,是由CreateWindow()實現的,它將window與一個windowClass聯系起來,而后者中記錄了Message響應函數的指針。
            至于細節,看一下如何用Win32 SDK或Win16 SDK寫程序就清楚了,其中 DefWindowProc()是API函數,負責提供缺省的消息處理,所以,程序員只需要handle需要特殊處理的消息。

            int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
            {
            WNDCLASS wndclass;
            ...
            wndclass.lpfnWndProc =WndProc;
            wndclass.lpszClassName = szWindowClass;
            ...
            RegisterClass(&wndclass);
            hWnd = CreateWindow( szWindowClass, ...);
            ...
            }
            LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
            {
            switch(message)
            {
            ...
            return;
            }
            return DefWindowProc(hwnd,message,wParam,lParam);
            }
            
            2.2 MFC中Message響應函數的安裝

            MFC中Message響應函數的安裝顯然更復雜,是在CWnd::CreateEx()被調用時完成的,其中還用到了Hook機制。

            我們可以先猜一下MFC是怎么做的。MFC支持massage map,使得對消息的響應份散到多個message handler函數中,而不是API開發是那種集中式的消息處理函數;所以,想必會有專門的代碼來負責“檢索message map table然后調用message handle”。message map是為了支持程序員處理他關心的特殊message的,那么缺省的message處理邏輯在哪里呢?答案是MFC創建window obj時是用的“預定義的窗口類”,自然已經有了缺省的message處理函數。

            從圖中看到,CWnd有成員變量m_pfnSuper、成員變量m_hWnd、成員函數OnWndMsg()和成員函數DefWindowProc()。Wnd::OnWndMsg()負責“在message map中定義的message handle”能否處理到來的message,如果處理了要返回true;CWnd::DefWindowProc()負責對message缺省處理。
            執行過程是,首先CWnd::CreateEx()被調用,window obj和window class被相應建立,此時window class的WindowProc字段存儲了預定義的缺省處理函數的地址;由于有hook在監聽窗口創建消息,所以注冊的hookProc()會被調用執行,它將classWindow數據結構的WindowProc字段備份到CWnd::m_pfnSuper,再用SetWindowLong()改寫classWindow數據結構的WindowProc字段為::AfxWndProc()的地址。當任何一個message到達時,::AfxWndProc()被調用,至于它的邏輯,聰明的你一定猜到了,先調用Wnd::OnWndMsg(),如果返回值為false,還要調用CWnd::DefWindowProc(),CWnd::m_pfnSuper指向的缺省處理邏輯,也會在CWnd::DefWindowProc()中被調用。
            提示,上面其實有多態情況發生。比如你可以在搜一下pWnd->WindowProc(nMsg, wParam, lParam); 另外,OnWndMsg和DefWindowProc都是CWnd類的虛擬函數。

            要是覺得不太好理解,最好在VC++里創建一個project實際跟蹤一下,下面是我跟蹤時調用棧映象的截圖。


            3. SubClass機制


            從圖中看到,SubClass機制以CWnd自身的m_pfnSuper為基礎,和“MFC中Message響應函數的安裝”很象。

            4.frame work中的主要相關類

            frame work中的主要相關類 就是 message route的候選人,正是它們的OnCmdMsg()共同完成了message route,形成了chain of responsability模式。

            5. frame work中的chain of responsability模式

            下圖是一個對象樹,注意消息會在縱向和橫向兩個方向傳播。


            消息在縱向方向上的傳遞,是在“上溯父類的massge map表”,MFC的message map完全是為了代替虛函數而采取的手段,而和message route無關。

            消息在橫向方向上的傳遞,才是message route,才是chain of responsability模式,由多個相關類的OnCmdMsg()共同完成。

            三、 總結
            從上面的討論不難發現,MFC中用到了不少設計模式,如上面提到的chain of responsability模式、composite模式和“訂閱-發布”模式。上面的討論不僅有助于程序員全面掌握Win32 API和MFC,對architect設計architecture也有很大幫助。

            posted on 2008-11-01 15:38 wrh 閱讀(352) 評論(0)  編輯 收藏 引用

            導航

            <2008年11月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            統計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            性高朝久久久久久久久久| 亚洲国产精品一区二区久久hs| 国产精品久久久久影视不卡 | 99国产欧美精品久久久蜜芽| 亚洲伊人久久精品影院| 伊人久久大香线蕉AV一区二区| 亚洲?V乱码久久精品蜜桃| 久久久无码精品亚洲日韩蜜臀浪潮 | 国内精品久久久久久99蜜桃| 久久综合一区二区无码| 久久国产精品99精品国产| 久久久久久久久久久免费精品| 国产精品丝袜久久久久久不卡 | 久久A级毛片免费观看| 久久A级毛片免费观看| 国产精品成人久久久久三级午夜电影| 久久国产乱子伦免费精品| 久久久久婷婷| 久久综合给合久久国产免费| 久久国产免费直播| 久久免费视频1| 久久精品国产亚洲一区二区三区| 伊人久久大香线蕉成人| WWW婷婷AV久久久影片| 国产精品成人精品久久久| 久久人人爽人人爽人人AV东京热| 999久久久免费精品国产| 国产99久久九九精品无码| 国产免费久久久久久无码| 亚洲精品美女久久久久99| 国产精品久久久久久久午夜片| 久久精品国产亚洲av高清漫画| 精品久久久久久久久久久久久久久| 91精品观看91久久久久久| 日本道色综合久久影院| 久久精品成人欧美大片| 亚洲香蕉网久久综合影视 | 久久99精品国产99久久| 日韩精品无码久久久久久| 国产精品一区二区久久精品| 狠狠久久亚洲欧美专区|