• <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>

            無我

            讓內心永遠燃燒著偉大的光明的精神之火!
            靈活的思考,嚴謹的實現
            豪邁的氣魄、頑強的意志和周全的思考

            【轉】什么是COM組件

            什么是COM組件

            用戶需要什么樣的軟件產品?這是一個多選題,但高效,健壯是肯定會被選種的。作為一名軟件開發人員如何做才能滿足用戶的需要呢?必須要保證升級應用時不破壞與以前版本的向后兼容性。必須做到擴展系統服務時不依賴特定的操作系統。面向對象的程序設計顯然是一次革命性的改變。采用面向對象的設計方法我們可以很容易的把要解決的問題事物抽象成各種類,并將內部動作封裝隱藏起來,只提供一些接口。但這并沒有完全解決我們的問題。昨天我在《程序員》雜志上看到,現在是后OO時代,那OO以后是什么呢?應該是面向組件吧。

            雷神剛剛讀完《COM技術內幕》一書,整理了一個FAQ,供大家在學習此書時參考。

            這是第一部分,包含前3章的內容。

             

            FAQ1:什么是COM組件?〖第一章〗

            FAQ2:組件不是……?〖第一章〗

            FAQ3:什么是接口?〖第二章〗

            FAQ4:接口的作用是什么?〖第二章〗

            FAQ5:什么是IUnKnown? 〖第三章〗

            FAQ6QueryInterface函數的作用是什么?〖第三章〗

            FAQ7QueryInterface函數的實現規則是什么?〖第三章〗

            FAQ8QueryInterface的樣子?〖第三章〗

            FAQ9QueryInterface函數的參數IID是什么?〖第三章〗

            FAQ10:何時需要建立一個新的COM組件版本?〖第三章〗

             

            Question

            什么是COM組件?

            Answer:

            COM組件是以WIN32動態鏈接庫(DLL)或可執行文件(EXE)形式發布的可執行代碼組成。

            COM組件是遵循COM規范編寫的

            COM組件是一些小的二進制可執行文件

            COM組件可以給應用程序、操作系統以及其他組件提供服務

            自定義的COM組件可以在運行時刻同其他組件連接起來構成某個應用程序

            COM組件可以動態的插入或卸出應用

            COM組件必須是動態鏈接的

            COM組件必須隱藏(封裝)其內部實現細節

            COM組件必須將其實現的語言隱藏

            COM組件必須以二進制的形式發布

            COM組件必須可以在不妨礙已有用戶的情況下被升級

            COM組件可以透明的在網絡上被重新分配位置

            COM組件按照一種標準的方式來宣布它們的存在

            Question

              組件不是……?

            Answer:

            COM組件不是一種計算機語言

            COM組件不是DLL,只是利用DLL來給組件提供動態鏈接的能力

            COM組件不是一個API函數集。

            COM組件不是類

            Question

              什么是接口?

            Answer:

            接口就是提供兩個不同對象間的一種連接。

            計算機程序是通過一組函數而進行連接的,這組函數就是定義了程序中不同部分的接口。

            DLL的接口就是它所輸出的那些函數。

            C++類的接口就是該類的成員函數集。

            COM中的接口是一組由組件實現的提供給客戶使用的函數。

            COM中接口是一個包含函數指針數組的內存結構,數組元素是一個由組件實現的函數地址。

            Question

              接口的作用是什么?

            Answer:

              有了組件如何將它們連接起來構成某個應用程序,需要用接口。

              COM中接口就是一切,對客戶說組件就是接口集,客戶只能通過接口和組件打交道。

              說明接口可以保護系統免受外界變化的影響。這是封裝的體現。

              接口實現了使用戶使用同樣的方式來處理不同的組件。這是多態的體現。

             

            Question

              接口的如何實現?

            Answer:

              COM接口在C++中是用純抽象基類實現。

              一個COM組件可以支多個接口。

              一個C++類可以使用多重繼承來實現一個支持多個接口的組件。

              組件可以支持任意數目的接口。

            接口應該具有不變性。在組件升級時應該不修改原來的接口,而是添加新的接口。

            要精心設計實現接口,以使之能夠支持各種不同的實現。

             

            Question

              什么是IUnKnown?

            Answer:

              IUnKnown是一個接口。

              所有COM接口都繼承IUnKnown

              IUnKnown的定義在WIN32 SDK中的UNKNWN頭文件中。

              ///IUnKnown的定義

              interface IUnKnown

              {

                virtual HRESULT __stdcall QueryInterface(const IID& iid,void **ppv)=0;

                virtual ULONG __stdcall AddRef()=0;

                virtual ULONG __stdcall Release()=0;

              }

             

            Question

              QueryInterface函數的作用是什么?

            Answer:

              QueryInterfaceIUnKnown的成員函數,客戶可以通過此函數來查詢組件是否支持某個特定的接口。

              QueryInterface函數返回一個指向組件支持的接口的指針。

              如果QueryInterface函數沒有找到組件支持的接口則返回指針是NULL

              QueryInterface函數可以使用ifthenelse語句、數組、散列表、樹來實現。

              QueryInterface函數不能使用case語句,因為QueryInterface函數返回的是一個HRESULT結構而不是一個數。

            QueryInterface也是一種無封處理組件版本的機制。這種機制使得組件的新舊不同的版本可以互操作。

            Question

              QueryInterface函數的實現規則是什么?

            Answer:

              QueryInterface返回的IUnKnown指針總是相同。

              若客戶獲得了某個接口,那么它總能獲得此接口。

              客戶可以再次獲得已經擁有的接口。

              客戶可以返回到起始接口。

              若能夠在某個接口獲得某個特定接口,那么從任意接口都將可以獲得此接口。

            Question

              QueryInterface函數的參數IID是什么?

            Answer:

              它是一個結構,接口標識符結構。

            IID標識了客戶所需的接口。

              每一個接口都有一個唯一的接口標識符。所以某個與IID相對應的接口絕對不會發生變化。

              接口IID決定了COM組件的版本。

              不同的接口具有不同的ID,包括不同版本的接口。

             

            Question

              何時需要建立一個新的COM組件版本?

            Answer:

              當為已有接口指定新的ID時應該是下面的條件至少有一個成立。

              接口中函數的數目發生改變時。

              接口中函數的順序發生改變。

              接口中某個函數的參數發生改變

              接口中某個函數的參數的順序發生改變

              接口中某個函數的參數的類型發生改變

              接口中函數的返回值發生改變

              接口中函數的返回值類型發生改變

              接口中函數的參數的含義發生改變

              接口中函數的含義發生改變

            簡單地說,COM是一種跨應用和語言共享二進制代碼的方法。與C++不同,它提倡源代碼重用。ATL便是一個很好的例證。源碼級重用雖然好,但只能用于C++。它還帶來了名字沖突的可能性,更不用說不斷拷貝重用代碼而導致工程膨脹和臃腫。

            Windows使用DLLs在二進制級共享代碼。這也是Windows程序運行的關鍵——重用kernel32.dll, user32.dll等。但DLLs是針對C接口而寫的,它們只能被C或理解C調用規范的語言使用。由編程語言來負責實現共享代碼,而不是由DLLs本身。這樣的話DLLs的使用受到限制。

            MFC引入了另外一種MFC擴展DLLs二進制共享機制。但它的使用仍受限制——只能在MFC程序中使用。

            COM通過定義二進制標準解決了這些問題,即COM明確指出二進制模塊(DLLsEXEs)必須被編譯成與指定的結構匹配。這個標準也確切規定了在內存中如何組織COM對象。COM定義的二進制標準還必須獨立于任何編程語言(如C++中的命名修飾)。一旦滿足了這些條件,就可以輕松地從任何編程語言中存取這些模塊。由編譯器負責所產生的二進制代碼與標準兼容。這樣使后來的人就能更容易地使用這些二進制代碼。

            在內存中,COM對象的這種標準形式在C++虛函數中偶爾用到,所以這就是為什么許多COM代碼使用C++的原因。但是記住,編寫模塊所用的語言是無關的,因為結果二進制代碼為所有語言可用。

            此外,COM不是Win32特有的。從理論上講,它可以被移植到Unix或其它操作系統。但是我好像還從來沒有在Windows以外的地方聽說過COM

             

            posted on 2007-10-28 10:38 Tim 閱讀(3382) 評論(0)  編輯 收藏 引用 所屬分類: 資源共享

            <2007年10月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            導航

            統計

            公告

            本博客原創文章,歡迎轉載和交流。不過請注明以下信息:
            作者:TimWu
            郵箱:timfly@yeah.net
            來源:www.shnenglu.com/Tim
            感謝您對我的支持!

            留言簿(9)

            隨筆分類(173)

            IT

            Life

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            日产精品久久久久久久性色| 国内精品久久久久久久涩爱| 日韩精品久久久久久久电影| 天天躁日日躁狠狠久久| 国产成人AV综合久久| 亚洲午夜久久久久久久久久| 久久综合丁香激情久久| 久久久久亚洲av综合波多野结衣| 国产精品一久久香蕉国产线看观看| 午夜精品久久久久久久无码| 国产激情久久久久影院老熟女| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久久久国产精品| 日韩精品无码久久一区二区三| 无码AV波多野结衣久久| 久久久久亚洲AV成人网人人网站| 久久亚洲AV成人无码国产| 亚洲综合精品香蕉久久网97 | AAA级久久久精品无码片| 亚洲美日韩Av中文字幕无码久久久妻妇| 久久综合狠狠色综合伊人| 国产精品一区二区久久精品涩爱| 久久久久久av无码免费看大片| 99久久精品免费看国产一区二区三区| 中文字幕无码久久人妻| 亚洲一区中文字幕久久| 国产精品无码久久综合| 午夜天堂精品久久久久| 久久综合久久鬼色| 国产伊人久久| 久久综合狠狠综合久久激情 | 久久精品人人做人人爽97 | 亚洲综合久久综合激情久久| 久久久久人妻精品一区二区三区| 国内精品久久国产| 久久久久女教师免费一区| 亚洲精品国产成人99久久| 99麻豆久久久国产精品免费| 久久99精品免费一区二区| 久久精品一区二区| 一本一道久久a久久精品综合|