青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-19  評論-2  文章-0  trackbacks-0

2009-10-2

======================
《深入解析MFC》筆記 11. MFC 實現(xiàn) COM
======================

    COM ( Component Object Model,組件對象模型)
    OLE 是微軟的對象技術(shù)的名字,是一種整合軟件的統(tǒng)一方法,使得軟件可以隨時間而演變,是一種整合技術(shù)。
        從時間的角度講,OLE是最早出現(xiàn)的,然后是COM和 ActiveX;
        從體系結(jié)構(gòu)角度講,OLE和ActiveX是建立在COM之上的,所以COM是基礎(chǔ);
    OLE的主要目標(biāo)是使得應(yīng)用程序被外界所認識和理解。
    使用COM編程的目的是使得軟件從源代碼以及的重用上升到二進制一級的重用。
   
    組件是一個可重用的模塊,由一組處理過程、數(shù)據(jù)封裝和用戶接口組成的業(yè)務(wù)對象(Rules Object)。組件看起來像對象。它們的主要區(qū)別是:
  1)組件可以在另一個稱為容器(有時也稱為承載者或宿主)的應(yīng)用程序中使用,也可以作為獨立過程使用;
  2)組件可以由一個類構(gòu)成,也可以由多個類組成,或者是一個完整的應(yīng)用程序;
  3)組件為模塊重用,而對象為代碼重用。
  組件模型有COM(Component Object Model,對象組件模型)/DCOM(Distributed COM,分布式對象組件模型)和CORBA(Common Object Request Broker Architecture,公共對象請求代理體系結(jié)構(gòu))。
  
  
=================
COM
   
    ------------------------
    COM 類
        COM 所做的全部工作就是在二進制一級共享軟件。
       
        C++ 類 和 COM 類
            1、C++使用操作符new來實例化一個對象,而COM對象通過API的函數(shù)來創(chuàng)建。
            2、C++使用delete來刪除一個對象,COM使用引用計數(shù)來控制對象的生存期,引用計數(shù)為0,自動刪除。
            3、C++使用特殊的機制來控制運行時類型信息(run-time type info)和類型轉(zhuǎn)化(typecasting),而COM類通過成員函數(shù)來支持
            4、C++類提供成員函數(shù)和數(shù)據(jù)以供外部訪問,COM中,類只提供成員函數(shù)。
            5、COM類沒有具體規(guī)定的布局。
            6、COM引入了一套接口的規(guī)范來形式化對象指針的概念。
        使用COM對象:
            ①、給操作系統(tǒng)發(fā)送實例化一個COM的請求;
            ②、得到對象的一個接口指針
            ③、使用接口;          ④、釋放接口
           
    ------------------------          
    COM 接口
        一個接口就是一組等待被實現(xiàn)的純虛函數(shù)
       
    GUID
        Globally Unique Identifier   128位數(shù)字
       
        COM 類的ID用 "CLSID"作為前綴,
        接口 ID 用"IID"作為前綴

=================
IUnknown接口
    struct IUnknown{
        virtual HRESULT QueryInterface ( IID& iid, void** ppvObj ) = 0;
        virtual ULONG AddRef()  = 0;
        virtual ULONG Release()  =  0;
    }
    -------
    對象生存期管理
        COM對象自己控制生存期。
        COM 對象的引用計數(shù)由 IUnknown 接口的 AddRef() 和Release() 這兩個函數(shù)來管理。
    --------
    接口協(xié)商(negotiation,運行時發(fā)現(xiàn)功能)
        當(dāng)一個客戶擁有了一個COM對象的一個接口指針,就能夠通過 QueryInterface() 發(fā)現(xiàn)這個對象所支持的別的接口
        HRESULT  QueryInterface ( REFIID  riid,  LPVOID  far*  ppvObj );
            riid用來標(biāo)識所要得到的接口的 GUID。
            ppvObj 用來存放接口指針
        實現(xiàn) IUnknown::QueryInterface的一個方法:
                HRESULT CoSomeObject::QueryInterface ( IID& riid, void  FAR** ppvObj ){
                    HRESULT hr = ResultFromSCode ( E_NOINTERFACE );
                    *ppvObj = NULL;
                    if ( riid == IID_IUnknown ){
                        *ppvObj = ( IPersist * ) this;
                        hr = NOERROR;
                    } else if (riid  == IID_IPersist ) {
                            *ppvObj = ( IPersist * ) this;
                            hr = NOERROR;
                      }
                    return hr;               
                }
    -------------
    調(diào)用 、 使用 、釋放。
        1、調(diào)用某個方法得到一個接口(通過初始化一個對象或者通過一個存在的接口調(diào)用 QueryInterface())。
        2、使用接口內(nèi)的函數(shù)。
        3、調(diào)用Release() 對對象引用計數(shù)減1.
       
========================
COM 對象服務(wù)器
   
    COM類存在于服務(wù)器之中。COM服務(wù)器分為兩種: 進程內(nèi)服務(wù)器(in-proc)和進程外服務(wù)器(out-proc)。
        in-proc server 是 DLL形式的,他們與客戶在同一個進程空間內(nèi)。
        out-proc server 是作為 EXE文件形式存在,和客戶在不同的進程空間內(nèi)(甚至在不同機器).
   
    進程內(nèi)服務(wù)器(DLL)
    進程外服務(wù)器(EXE)
        有更強的魯棒性,進程外服務(wù)器需要付出額外的代價,列集(marshaling)。
        一個進程空間內(nèi)的地址(數(shù)據(jù)地址、函數(shù)指針)在另一個進程空間內(nèi)不起作用,需要用遠程過程調(diào)用(RPC)和列集(marshaling)。
            marshaling:
                每一個接口,在客戶代碼中有一個代理(proxy),一個代理是一個接口的進程內(nèi)實現(xiàn)。
                服務(wù)端中,每一個特定的接口都建立了一份存根(stub)代碼(在服務(wù)器進程空間內(nèi))。存根是RPC傳輸?shù)慕邮斩耍?br>            它把代理傳過來的函數(shù)調(diào)用和參數(shù)傳遞映射為映射為服務(wù)器進程內(nèi)的函數(shù)調(diào)用和參數(shù)傳遞。
                客戶通過接口進行函數(shù)調(diào)用時,代理將參數(shù)打包為一個32位可移植的數(shù)據(jù)結(jié)構(gòu)。打包完后,對服務(wù)器進程產(chǎn)生一個遠程過程調(diào)用。
                服務(wù)器端,存根保存真正的接口指針、函數(shù)和相關(guān)的數(shù)據(jù)結(jié)構(gòu)。存根將參數(shù)從包中解開以在本進程空間內(nèi)調(diào)用。
                一個函數(shù)調(diào)用返回時,存根將返回值和其他返回信息打包,發(fā)送回代理。代理解包,取出返回值供客戶使用。
               
    類廠(class  factory)
        COM通過類廠來創(chuàng)建對象,進程空間內(nèi)的每一個COM類都有一個類廠與之相對應(yīng)。類廠產(chǎn)生的是對象,不是類。
        類廠是一個特殊COM類。
        一個重要的接口是 IClassFactory。它包含兩個函數(shù):CreateInstance()和LockServer()。
            客戶通過調(diào)用CreateInstance來創(chuàng)建OLE類的實例,LockServer來增加整個服務(wù)器的引用計數(shù)。
        每一個COM類在源代碼一級都有自己的類廠。
            進程內(nèi)服務(wù)器通過一個預(yù)先定義的函數(shù)將類廠提供給客戶,
            進程外服務(wù)器將類廠注冊到 Windows的注冊表中。
           
    在進程內(nèi)服務(wù)器提供類廠
        通過導(dǎo)出函數(shù)(exported function)來提供類廠,函數(shù)名為:DLLGetClassObject()。
            客戶可以通過 CoGetClassObject() 或 CoCreateInstance() 來創(chuàng)建一個 COM 對象。它們都調(diào)用了DLLGetClassObject來得到相應(yīng)COM類的類廠接口指針。
        然后可以調(diào)用類廠的CreateInstance() 來創(chuàng)建一個類的實例并且得到一個接口指針。
            STDAPI  DllGetClassObject ( REFCLSID rclsid, REFIID  riid,  LPVOID  FAR* ppv)
            要得到的類廠的COM類的GUID值,第三個參數(shù) 是一個指向接口指針的指針,用來存放請求的接口指針的地方。
           
    在進程外服務(wù)器中提供類廠:
        在運行時在注冊表里注冊類廠,CoRegisterClassObject():
            HRESULT CoRegisterClassObject ( REFCLSID clsid,           // 要注冊的類的GUID
                        IUnknown *pUnk,                          //對象的 IUnknown 指針
                        DWORD  grfContext,              //參數(shù)用來標(biāo)識服務(wù)器的環(huán)境——可執(zhí)行的服務(wù)器代碼是一個DLL、一個本地服務(wù)器還是一個遠程服務(wù)器
                        DWORD  grfFlags,               //用來表示客戶使用何種方式跟服務(wù)器建立連接
                        LPDWORD  pdwRegister );     //指向DWORD的指針,所指向的值在類廠注冊的時候由COM來填寫。該值標(biāo)識了類廠的注冊信息,可以通過
                                                                        它然后調(diào)用 CoRevokeClassObject() 來取消類廠的注冊。
                                                                       
    卸載進程內(nèi)服務(wù)器
        調(diào)用COM中的 CoFreeUnusedLibraries() 來實現(xiàn)這個功能,該函數(shù)通過調(diào)用DLL的DLLCanUnloadNow()來詢問是否能被卸載。
    卸載進程外服務(wù)器
        進程外服務(wù)器是自己卸載自己,
            · 當(dāng)客戶減少服務(wù)器的引用計數(shù)(通過調(diào)用IClassFactory::LockServer ( FALSE ),而且外部沒有對象了。
            · 當(dāng)客戶釋放最后一個對象的最后一個接口指針,并且服務(wù)器的鎖計數(shù)是0.
           


 

posted on 2010-03-15 23:28 Euan 閱讀(1030) 評論(0)  編輯 收藏 引用 所屬分類: windows
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区二区三区激情| 999在线观看精品免费不卡网站| 久久精精品视频| 欧美久久久久久蜜桃| 久久九九99视频| 欧美一区二区三区在线观看| 午夜精品久久久久久久99水蜜桃 | 国产精品网曝门| 国产精品成人一区二区网站软件| 欧美午夜在线视频| 国产老女人精品毛片久久| 国产麻豆综合| 久久久99久久精品女同性| 欧美影院成年免费版| 久久久久在线| 欧美福利在线| 日韩一区二区电影网| 亚洲午夜精品久久| 欧美一级视频免费在线观看| 久热爱精品视频线路一| 女主播福利一区| 欧美资源在线| 国内精品嫩模av私拍在线观看| 欧美一区日本一区韩国一区| 久久久久久一区二区| 亚洲福利视频二区| 亚洲国产精品久久91精品| 国产精品99久久久久久人 | 国产一区二区三区四区hd| 国一区二区在线观看| 亚洲国产1区| 亚洲一二三区在线| 久久久综合网| 99国产一区| 欧美中文字幕久久| 亚洲电影在线播放| 亚洲制服欧美中文字幕中文字幕| 久久久久国产精品人| 欧美搞黄网站| 欧美一区2区视频在线观看| 欧美日韩亚洲激情| 国产在线高清精品| 国产精品99久久久久久www| 欧美电影免费观看| 亚洲欧美视频一区| 亚洲欧美999| 欧美大片一区二区三区| 国产欧美精品一区aⅴ影院| 亚洲精品在线三区| 久热精品视频在线免费观看| 亚洲精品一区二区三区蜜桃久| 欧美影院视频| 国产精品av一区二区| **网站欧美大片在线观看| 国产美女精品人人做人人爽| 亚洲激情不卡| 久久久五月天| 香蕉久久夜色精品| 亚洲精品日韩欧美| 久久久久久伊人| 国产一区二区三区高清播放| 日韩一级二级三级| 欧美成人自拍| 久久免费少妇高潮久久精品99| 国产欧美精品日韩精品| 亚洲欧美日韩国产综合精品二区| 亚洲人永久免费| 免费人成精品欧美精品| 欧美激情1区2区3区| 欧美高清在线视频| 欧美影院在线| 国产欧美日韩综合一区在线观看| 一区二区三区视频在线观看| 亚洲精品免费看| 裸体一区二区| 亚洲三级毛片| 亚洲精品系列| 欧美婷婷六月丁香综合色| 亚洲无毛电影| 亚洲午夜av| 国产欧美丝祙| 亚洲福利视频二区| 亚洲电影中文字幕| 亚洲欧洲三级| 欧美日韩亚洲系列| 亚洲一区二区三区777| 一区二区不卡在线视频 午夜欧美不卡在| 欧美电影在线播放| 一本色道久久综合狠狠躁的推荐| 亚洲国产精品欧美一二99| 久久爱另类一区二区小说| 欧美一区二区精美| 影音先锋中文字幕一区| 欧美激情一区二区三区不卡| 欧美日韩另类综合| 午夜精品久久久久久久男人的天堂| 亚洲先锋成人| 一区二区视频免费完整版观看| 欧美大片免费观看在线观看网站推荐 | 午夜在线视频观看日韩17c| 亚洲永久免费精品| 亚洲毛片在线看| 国产精品qvod| 久久久午夜视频| 女同性一区二区三区人了人一| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲精品久久久久中文字幕欢迎你| 亚洲欧洲一级| 国产精品日本欧美一区二区三区| 久久久之久亚州精品露出| 欧美1区3d| 性视频1819p久久| 久久资源在线| 亚洲综合精品一区二区| 久久精品免费| 国产一区二区电影在线观看| 亚洲高清久久网| 亚洲欧美一区二区三区极速播放| 亚洲激情在线| 国产在线精品一区二区夜色| 美女国内精品自产拍在线播放| 久久噜噜噜精品国产亚洲综合| 欧美日韩ab| 久久天天躁狠狠躁夜夜爽蜜月| 欧美 日韩 国产精品免费观看| 在线观看一区二区精品视频| 亚洲一区二区三区乱码aⅴ| 久久精品欧洲| 99在线|亚洲一区二区| 久久精品国产欧美激情| 亚洲欧美国产77777| 欧美激情一区二区三区在线视频观看 | 亚洲精品日韩欧美| 亚洲一区国产精品| 亚洲精品资源| 免费高清在线视频一区·| 久久av二区| 欧美午夜电影网| 欧美精品亚洲一区二区在线播放| 亚洲精品美女在线观看播放| 性久久久久久久久| 亚洲欧美久久久| 欧美日韩直播| 亚洲国产日韩欧美一区二区三区| 国产欧美在线视频| 亚洲一二三区在线| 在线视频一区二区| 欧美激情一级片一区二区| 亚洲国产成人午夜在线一区| 亚洲国产另类久久久精品极度| 欧美在线视频一区二区三区| 欧美亚洲午夜视频在线观看| 国产精品chinese| 日韩一级在线| 亚洲欧美第一页| 国产麻豆综合| 久久高清一区| 韩国v欧美v日本v亚洲v| 久久av一区二区| 欧美h视频在线| 亚洲毛片一区| 欧美在线一级视频| 麻豆亚洲精品| 亚洲免费高清| 国产精品v片在线观看不卡| 久久久久久有精品国产| 亚洲欧美日韩精品久久奇米色影视 | 亚洲女人天堂成人av在线| 欧美在线三区| 一区二区三区在线不卡| 老司机精品视频一区二区三区| 欧美韩国日本综合| 久久在线播放| 欧美日韩一区二区在线视频 | 亚洲男人的天堂在线观看| 欧美一区亚洲二区| 激情视频一区| 欧美日韩直播| 亚洲成人在线网| 亚洲欧美激情视频| 亚洲成人直播| 欧美一区二区三区久久精品| 伊人久久综合97精品| 欧美视频一区二| 久久综合伊人77777| 亚洲婷婷综合色高清在线| 欧美顶级少妇做爰| 欧美综合77777色婷婷| 亚洲视频1区2区| 亚洲国产日韩美| 裸体丰满少妇做受久久99精品| 欧美日韩专区| 久久婷婷国产综合尤物精品| 在线一区免费观看| 欧美成人激情在线| 亚洲伊人伊色伊影伊综合网| 亚洲国产一区二区精品专区| 国产一区91| 国产日本欧美一区二区三区| 欧美久久婷婷综合色|