有關COM的一些基本知識 (轉)

worldblog發表於2007-12-03
有關COM的一些基本知識 (轉)[@more@]

 模型的基本知識 
  基於構件的開發日益流行,這裡我吧自己在學校時整理的關於COM的一些東西獻給大家,供初學者參考.
一.元件
(COM),是公司為了工業的軟體生產更加符合人類的行為方式開發的一種新的軟體開發技術。在COM構架下,人們可以開發出各種各樣的功能專一的元件,然後將它們按照需要組合起來,構成複雜的應用。由此帶來的好處是多方面的:可以將系統中的元件用新的替換掉,以便隨時進行系統的升級和定製;可以在多個應用系統中重複利用同一個元件;可以方便的將應用系統擴充套件到環境下;COM與語言,平臺無關的特性使所有的員均可充分發揮自己的才智與專長編寫元件模組;等等。 
COM是開發軟體元件的一種方法。元件實際上是一些小的二進位制可程式,它們可以給應用程式,以及其他元件提供服務。開發自定義的COM元件就如同開發動態的,物件導向的。多個COM物件可以連線起來形成應用程式或元件系統。並且元件可以在執行時刻,在不被重新連結或編譯應用程式的情況下被卸下或替換掉。的許多技術,如, 以及OLE等都是基於COM而建立起來的。並且Microsoft的開發人員也大量使用COM元件來定製他們的應用程式及作業系統。
COM所含的概念並不止是在Microsoft 作業系統下才有效。COM並不是一個大的API,它實際上象結構化及物件導向程式設計方法那樣,也是一種程式設計方法。在任何一種作業系統中,開發人員均可以遵循“COM方法”。
一個應用程式通常使由單個的二進位制組成的。當生成應用程式之後,在對下一個版本重新編譯併發行新生成的版本之前,應用程式一般不會發生任何變化。作業系統,及客戶需求的改變都必須等到整個應用程式被重新生成。
目前這種狀況已經發生變化。開發人員開始將單個的應用程式分隔成單獨多個獨立的部分,也既元件。這種做法的好處是可以隨著技術的不斷髮展而用新的元件取代以有的元件。此時的應用程式可以隨新元件不斷取代舊的元件而漸趨完善。而且利用已有的元件,還可以的建立全新的應用。
傳統的做法是將應用程式分割成檔案,模組或類,然後將它們編譯並連結成一個單模應用程式。它與元件建立應用程式的過程(稱為元件構架)有很大的不同。一個元件同一個微型應用程式類似,即都是已經編譯連結好並可以使用的二進位制程式碼,應用程式就是由多個這樣的元件打包而得到的。單模應用程式只有一個二進位制程式碼模組。自定義元件可以在執行時刻同其他的元件連線起來以構成某個應用程式。在需要對應用程式進行修改或改進時,只需要將構成此應用程式的元件中的某個用新的版本替換掉即可。
COM,即元件物件模型,是關於如何建立元件以及如何透過元件建立應用程式的一個規範,說明了如何可動態交替元件。
使用元件的優點:
元件架構的一個優點就是應用可以隨時間的流逝而發展進化。除此之外,使用元件還有一些可以使對以有應用的升級更加方便和靈活的優點,如應用的定製,元件庫以及分散式元件等。
使用元件的種種優點直接來源於可以將它們動態的插入或卸出應用。為了實現這種功能,所有的元件必須滿足兩個條件:第一,元件必須動態連結;第二,它們必須隱藏(或封裝)其內部實現細節。動態連結對於元件而言是一個至關重要的要求,而訊息隱藏則是動態連結的一個必要條件。
二.介面
對於COM來講,介面是一個包含一個指標陣列的結構。每一個陣列元素包含的是一個由元件所實現的函式地址。對於COM而言,介面就是此記憶體結構,其他東西;均是COM不關心的實現細節。
在C++中,可以用抽象基類來實現COM介面。由於一個COM元件可以實現支援任意數目的介面,因此對於這樣的元件,可以用抽象基類的多重繼承來實現。用類來實現元件將比其他方法更為容易。
對於客戶來說,一個元件就是一個介面集。客戶只能透過介面才能和COM元件打交道。從整體上講,客戶對於一個元件可以說是知之甚少的。通常情況下,客戶甚至不必知道一個元件所提供的所有介面。
客戶同元件的互動是透過介面完成的。在客戶查詢元件其他的介面時,也是透過介面完成的。這個介面就是IUnknown。Iunknown介面的定義包含在 SDK中的UNKNOWN.H的標頭檔案中,引用如下:

interface IUnknown
{
  virtual HRESULT-_ _stdcall QueryInterface(const IID& iid,void **ppv)=0;
  virtual ULONG_ _stdcall AddRef( )=0;
  virtual ULONG_ _Release( )=0;
};

所有的COM都要繼承IUnknown。可以用Iunknown的介面指標來查詢該元件的其他的介面,並且每個介面的vtbl中的前三個函式都是QueryInterface,AddRef和Release。這使得所有的COM介面都可以被當作成IUnknown介面來處理。由於所有的介面都支援QueryInterface,因此元件的任何一個介面都可以被客戶用來獲取它所支援的其他介面。
在用QueryInterface將元件抽象成由多個相互獨立的介面構成的集合後,還需要管理元件的生命期。這一點是透過對介面的引用計數實現的。客戶並不能直接控制元件的生命期。當使用完一個介面而要用元件的另一個介面時,是不能將改元件釋放的。對元件的釋放可以由元件在客戶使用完所有的元件之後自己完成。IUnknown的另外兩個成員函式AddRef和Release的作用就是給客戶提供一種讓它指示何時處理完一個介面的手段。
AddRef和Release實現的是一種名為引用技術的記憶體管理技術。當客戶從元件獲得一個介面時,此引用計數值將增1。當客戶使用完某個介面時,元件的引用計數值將減1,當引用計數值為0時,元件可以將自己從記憶體中刪除。AddRef和Release可以增加和減少這一計數值。
三.建立
將元件分成多個介面只是將單模應用分個成多個部分的第一步,元件需要被放入動態連結庫(DLL)中。DLL是一個元件服務程式,或者說是發行元件的一種方式。元件實際上應看成是在DLL中實現的介面集。在客戶獲取某個元件介面指標之前,它必須先將相應的DLL裝載到其程式空間中,並建立此元件。
由於客戶元件所需要的所有函式都可以透過某個介面指標而訪問到,因此,可以在DLL中引出CreatInstance函式就可以使使用者它。之後,可以裝載DLL並呼叫其中的函式。此功能可由COM庫函式CoCreateInstance來實現。CoCreateInstance建立元件的過程是:傳給它一個CLSID,然後它建立相應的元件,並返回指向所請求的介面的指標。但CoCreateInstance沒有給客戶提供一種能控制元件建立過程的方法,缺乏一定的靈活性。事實上,常用類廠來建立元件。類廠就是一個帶有能夠建立其他元件的介面的元件。客戶先建立類廠本身,然後再用一個介面(如IClasactory)來建立所需的元件。然後還要用DllRegisterSever在Windows中註冊這個元件。
四.複用
COM元件可以被複用,它支援“介面繼承”。這種繼承指的是一個類繼承其基類的型別或介面。抽象基類是一種最純粹的介面繼承,並且正好也被用來實現COM介面。在COM中,我們可以用包容和聚合來對元件進行改造。
包容是在介面級完成的。外部元件包含指向內部介面的指標。此時,外部元件僅僅是內部元件的一個客戶而已,它將使用內部元件的介面來實現它自己的介面。外部元件也可以透過將呼叫轉發給內部元件的方法來重新實現內部元件所支援的某個介面。並且外部元件還可以在內部元件程式碼的前後加上一些程式碼以對介面進行改造。
聚合是包含的一種變化形式。當外部元件聚合了某個內部元件的一個介面時,它並沒有象包容那樣重新實現此介面並顯式的將呼叫請求轉發給內部元件。相反,外部元件直接把內部元件的介面指標返回給客戶。使用這種方法,外部元件將無需重新實現並轉發介面中的所有函式了。
包容和聚合為實現元件的複用提供了一種極具魯棒性的機制。在元件構架下,客戶於元件的實現完全隔離開了。
五.小結
以上是關於COM的一些基礎知識。遵循COM規範編寫的元件將會極大的改變傳統的軟體生產方式,具有廣闊的發展前景。這也將為軟體工程學引入新的內容和方法。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987717/,如需轉載,請註明出處,否則將追究法律責任。

相關文章