日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

有關(guān)COM的一些基本知識(shí)

 lvgs 2006-07-20

     
   基于構(gòu)件的軟件開發(fā)日益流行,這里我吧自己在學(xué)校時(shí)整理的關(guān)于COM的一些東西獻(xiàn)給大家,供初學(xué)者參考.
一.組件
(COM),是微軟公司為了計(jì)算機(jī)工業(yè)的軟件生產(chǎn)更加符合人類的行為方式開發(fā)的一種新的軟件開發(fā)技術(shù)。在COM構(gòu)架下,人們可以開發(fā)出各種各樣的功能專一的組件,然后將它們按照需要組合起來,構(gòu)成復(fù)雜的應(yīng)用系統(tǒng)。由此帶來的好處是多方面的:可以將系統(tǒng)中的組件用新的替換掉,以便隨時(shí)進(jìn)行系統(tǒng)的升級(jí)和定制;可以在多個(gè)應(yīng)用系統(tǒng)中重復(fù)利用同一個(gè)組件;可以方便的將應(yīng)用系統(tǒng)擴(kuò)展到網(wǎng)絡(luò)環(huán)境下;COM與語言,平臺(tái)無關(guān)的特性使所有的程序員均可充分發(fā)揮自己的才智與專長編寫組件模塊;等等。 
COM是開發(fā)軟件組件的一種方法。組件實(shí)際上是一些小的二進(jìn)制可執(zhí)行程序,它們可以給應(yīng)用程序,操作系統(tǒng)以及其他組件提供服務(wù)。開發(fā)自定義的COM組件就如同開發(fā)動(dòng)態(tài)的,面向?qū)ο蟮腁PI。多個(gè)COM對(duì)象可以連接起來形成應(yīng)用程序或組件系統(tǒng)。并且組件可以在運(yùn)行時(shí)刻,在不被重新鏈接或編譯應(yīng)用程序的情況下被卸下或替換掉。Microsoft的許多技術(shù),如ActiveX, DirectX以及OLE等都是基于COM而建立起來的。并且Microsoft的開發(fā)人員也大量使用COM組件來定制他們的應(yīng)用程序及操作系統(tǒng)。
COM所含的概念并不止是在Microsoft Windows操作系統(tǒng)下才有效。COM并不是一個(gè)大的API,它實(shí)際上象結(jié)構(gòu)化編程及面向?qū)ο缶幊谭椒菢?,也是一種編程方法。在任何一種操作系統(tǒng)中,開發(fā)人員均可以遵循“COM方法”。
一個(gè)應(yīng)用程序通常使由單個(gè)的二進(jìn)制文件組成的。當(dāng)編譯器生成應(yīng)用程序之后,在對(duì)下一個(gè)版本重新編譯并發(fā)行新生成的版本之前,應(yīng)用程序一般不會(huì)發(fā)生任何變化。操作系統(tǒng),硬件及客戶需求的改變都必須等到整個(gè)應(yīng)用程序被重新生成。
目前這種狀況已經(jīng)發(fā)生變化。開發(fā)人員開始將單個(gè)的應(yīng)用程序分隔成單獨(dú)多個(gè)獨(dú)立的部分,也既組件。這種做法的好處是可以隨著技術(shù)的不斷發(fā)展而用新的組件取代以有的組件。此時(shí)的應(yīng)用程序可以隨新組件不斷取代舊的組件而漸趨完善。而且利用已有的組件,用戶還可以快速的建立全新的應(yīng)用。
傳統(tǒng)的做法是將應(yīng)用程序分割成文件,模塊或類,然后將它們編譯并鏈接成一個(gè)單模應(yīng)用程序。它與組件建立應(yīng)用程序的過程(稱為組件構(gòu)架)有很大的不同。一個(gè)組件同一個(gè)微型應(yīng)用程序類似,即都是已經(jīng)編譯鏈接好并可以使用的二進(jìn)制代碼,應(yīng)用程序就是由多個(gè)這樣的組件打包而得到的。單模應(yīng)用程序只有一個(gè)二進(jìn)制代碼模塊。自定義組件可以在運(yùn)行時(shí)刻同其他的組件連接起來以構(gòu)成某個(gè)應(yīng)用程序。在需要對(duì)應(yīng)用程序進(jìn)行修改或改進(jìn)時(shí),只需要將構(gòu)成此應(yīng)用程序的組件中的某個(gè)用新的版本替換掉即可。
COM,即組件對(duì)象模型,是關(guān)于如何建立組件以及如何通過組件建立應(yīng)用程序的一個(gè)規(guī)范,說明了如何可動(dòng)態(tài)交替更新組件。
使用組件的優(yōu)點(diǎn):
組件架構(gòu)的一個(gè)優(yōu)點(diǎn)就是應(yīng)用可以隨時(shí)間的流逝而發(fā)展進(jìn)化。除此之外,使用組件還有一些可以使對(duì)以有應(yīng)用的升級(jí)更加方便和靈活的優(yōu)點(diǎn),如應(yīng)用的定制,組件庫以及分布式組件等。
使用組件的種種優(yōu)點(diǎn)直接來源于可以將它們動(dòng)態(tài)的插入或卸出應(yīng)用。為了實(shí)現(xiàn)這種功能,所有的組件必須滿足兩個(gè)條件:第一,組件必須動(dòng)態(tài)鏈接;第二,它們必須隱藏(或封裝)其內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。動(dòng)態(tài)鏈接對(duì)于組件而言是一個(gè)至關(guān)重要的要求,而消息隱藏則是動(dòng)態(tài)鏈接的一個(gè)必要條件。
二.接口
對(duì)于COM來講,接口是一個(gè)包含一個(gè)函數(shù)指針數(shù)組的內(nèi)存結(jié)構(gòu)。每一個(gè)數(shù)組元素包含的是一個(gè)由組件所實(shí)現(xiàn)的函數(shù)地址。對(duì)于COM而言,接口就是此內(nèi)存結(jié)構(gòu),其他東西;均是COM不關(guān)心的實(shí)現(xiàn)細(xì)節(jié)。
在C++中,可以用抽象基類來實(shí)現(xiàn)COM接口。由于一個(gè)COM組件可以實(shí)現(xiàn)支持任意數(shù)目的接口,因此對(duì)于這樣的組件,可以用抽象基類的多重繼承來實(shí)現(xiàn)。用類來實(shí)現(xiàn)組件將比其他方法更為容易。
對(duì)于客戶來說,一個(gè)組件就是一個(gè)接口集。客戶只能通過接口才能和COM組件打交道。從整體上講,客戶對(duì)于一個(gè)組件可以說是知之甚少的。通常情況下,客戶甚至不必知道一個(gè)組件所提供的所有接口。
客戶同組件的交互是通過接口完成的。在客戶查詢組件其他的接口時(shí),也是通過接口完成的。這個(gè)接口就是IUnknown。Iunknown接口的定義包含在Win32 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??梢杂肐unknown的接口指針來查詢該組件的其他的接口,并且每個(gè)接口的vtbl中的前三個(gè)函數(shù)都是QueryInterface,AddRef和Release。這使得所有的COM接口都可以被當(dāng)作成IUnknown接口來處理。由于所有的接口都支持QueryInterface,因此組件的任何一個(gè)接口都可以被客戶用來獲取它所支持的其他接口。
在用QueryInterface將組件抽象成由多個(gè)相互獨(dú)立的接口構(gòu)成的集合后,還需要管理組件的生命期。這一點(diǎn)是通過對(duì)接口的引用計(jì)數(shù)實(shí)現(xiàn)的??蛻舨⒉荒苤苯涌刂平M件的生命期。當(dāng)使用完一個(gè)接口而要用組件的另一個(gè)接口時(shí),是不能將改組件釋放的。對(duì)組件的釋放可以由組件在客戶使用完所有的組件之后自己完成。IUnknown的另外兩個(gè)成員函數(shù)AddRef和Release的作用就是給客戶提供一種讓它指示何時(shí)處理完一個(gè)接口的手段。
AddRef和Release實(shí)現(xiàn)的是一種名為引用技術(shù)的內(nèi)存管理技術(shù)。當(dāng)客戶從組件獲得一個(gè)接口時(shí),此引用計(jì)數(shù)值將增1。當(dāng)客戶使用完某個(gè)接口時(shí),組件的引用計(jì)數(shù)值將減1,當(dāng)引用計(jì)數(shù)值為0時(shí),組件可以將自己從內(nèi)存中刪除。AddRef和Release可以增加和減少這一計(jì)數(shù)值。
三.創(chuàng)建
將組件分成多個(gè)接口只是將單模應(yīng)用分個(gè)成多個(gè)部分的第一步,組件需要被放入動(dòng)態(tài)鏈接庫(DLL)中。DLL是一個(gè)組件服務(wù)程序,或者說是發(fā)行組件的一種方式。組件實(shí)際上應(yīng)看成是在DLL中實(shí)現(xiàn)的接口集。在客戶獲取某個(gè)組件接口指針之前,它必須先將相應(yīng)的DLL裝載到其進(jìn)程空間中,并創(chuàng)建此組件。
由于客戶組件所需要的所有函數(shù)都可以通過某個(gè)接口指針而訪問到,因此,可以在DLL中引出CreatInstance函數(shù)就可以使用戶調(diào)用它。之后,可以裝載DLL并調(diào)用其中的函數(shù)。此功能可由COM庫函數(shù)CoCreateInstance來實(shí)現(xiàn)。CoCreateInstance創(chuàng)建組件的過程是:傳給它一個(gè)CLSID,然后它創(chuàng)建相應(yīng)的組件,并返回指向所請求的接口的指針。但CoCreateInstance沒有給客戶提供一種能控制組件創(chuàng)建過程的方法,缺乏一定的靈活性。事實(shí)上,常用類廠來創(chuàng)建組件。類廠就是一個(gè)帶有能夠創(chuàng)建其他組件的接口的組件??蛻粝葎?chuàng)建類廠本身,然后再用一個(gè)接口(如IClassFactory)來創(chuàng)建所需的組件。然后還要用DllRegisterSever在Windows中注冊這個(gè)組件。
四.復(fù)用
COM組件可以被復(fù)用,它支持“接口繼承”。這種繼承指的是一個(gè)類繼承其基類的類型或接口。抽象基類是一種最純粹的接口繼承,并且正好也被用來實(shí)現(xiàn)COM接口。在COM中,我們可以用包容和聚合來對(duì)組件進(jìn)行改造。
包容是在接口級(jí)完成的。外部組件包含指向內(nèi)部接口的指針。此時(shí),外部組件僅僅是內(nèi)部組件的一個(gè)客戶而已,它將使用內(nèi)部組件的接口來實(shí)現(xiàn)它自己的接口。外部組件也可以通過將調(diào)用轉(zhuǎn)發(fā)給內(nèi)部組件的方法來重新實(shí)現(xiàn)內(nèi)部組件所支持的某個(gè)接口。并且外部組件還可以在內(nèi)部組件代碼的前后加上一些代碼以對(duì)接口進(jìn)行改造。
聚合是包含的一種變化形式。當(dāng)外部組件聚合了某個(gè)內(nèi)部組件的一個(gè)接口時(shí),它并沒有象包容那樣重新實(shí)現(xiàn)此接口并顯式的將調(diào)用請求轉(zhuǎn)發(fā)給內(nèi)部組件。相反,外部組件直接把內(nèi)部組件的接口指針返回給客戶。使用這種方法,外部組件將無需重新實(shí)現(xiàn)并轉(zhuǎn)發(fā)接口中的所有函數(shù)了。
包容和聚合為實(shí)現(xiàn)組件的復(fù)用提供了一種極具魯棒性的機(jī)制。在組件構(gòu)架下,客戶于組件的實(shí)現(xiàn)完全隔離開了。
五.小結(jié)
以上是關(guān)于COM的一些基礎(chǔ)知識(shí)。遵循COM規(guī)范編寫的組件將會(huì)極大的改變傳統(tǒng)的軟件生產(chǎn)方式,具有廣闊的發(fā)展前景。這也將為軟件工程學(xué)引入新的內(nèi)容和方法。


 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多