组件对象模型:COM
生活随笔
收集整理的這篇文章主要介紹了
组件对象模型:COM
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.組件
(com),是微軟公司為了計算機工業的軟件生產更加符合人類的行為方式開發的一種新的軟件開發技術。在com構架下,人們可以開發出各種各樣的功能專一的組件,然后將它們按照需要組合起來,構成復雜的應用系統。由此帶來的好處是多方面的:可以將系統中的組件用新的替換掉,以便隨時進行系統的升級和定制;可以在多個應用系統中重復利用同一個組件;可以方便的將應用系統擴展到網絡環境下;com與語言,平臺無關的特性使所有的程序員均可充分發揮自己的才智與專長編寫組件模塊;等等。
com是開發軟件組件的一種方法。組件實際上是一些小的二進制可執行程序,它們可以給應用程序,操作系統以及其他組件提供服務。開發自定義的com組件就如同開發動態的,面向對象的api。多個com對象可以連接起來形成應用程序或組件系統。并且組件可以在運行時刻,在不被重新鏈接或編譯應用程序的情況下被卸下或替換掉。microsoft的許多技術,如activex, directx以及ole等都是基于com而建立起來的。并且microsoft的開發人員也大量使用com組件來定制他們的應用程序及操作系統。
com所含的概念并不止是在microsoft windows操作系統下才有效。com并不是一個大的api,它實際上象結構化編程及面向對象編程方法那樣,也是一種編程方法。在任何一種操作系統中,開發人員均可以遵循“com方法”。
一個應用程序通常使由單個的二進制文件組成的。當編譯器生成應用程序之后,在對下一個版本重新編譯并發行新生成的版本之前,應用程序一般不會發生任何變化。操作系統,硬件及客戶需求的改變都必須等到整個應用程序被重新生成。
目前這種狀況已經發生變化。開發人員開始將單個的應用程序分隔成單獨多個獨立的部分,也既組件。這種做法的好處是可以隨著技術的不斷發展而用新的組件取代以有的組件。此時的應用程序可以隨新組件不斷取代舊的組件而漸趨完善。而且利用已有的組件,用戶還可以快速的建立全新的應用。
傳統的做法是將應用程序分割成文件,模塊或類,然后將它們編譯并鏈接成一個單模應用程序。它與組件建立應用程序的過程(稱為組件構架)有很大的不同。一個組件同一個微型應用程序類似,即都是已經編譯鏈接好并可以使用的二進制代碼,應用程序就是由多個這樣的組件打包而得到的。單模應用程序只有一個二進制代碼模塊。自定義組件可以在運行時刻同其他的組件連接起來以構成某個應用程序。在需要對應用程序進行修改或改進時,只需要將構成此應用程序的組件中的某個用新的版本替換掉即可。
com,即組件對象模型,是關于如何建立組件以及如何通過組件建立應用程序的一個規范,說明了如何可動態交替更新組件。
使用組件的優點:
組件架構的一個優點就是應用可以隨時間的流逝而發展進化。除此之外,使用組件還有一些可以使對以有應用的升級更加方便和靈活的優點,如應用的定制,組件庫以及分布式組件等。
使用組件的種種優點直接來源于可以將它們動態的插入或卸出應用。為了實現這種功能,所有的組件必須滿足兩個條件:第一,組件必須動態鏈接;第二,它們必須隱藏(或封裝)其內部實現細節。動態鏈接對于組件而言是一個至關重要的要求,而消息隱藏則是動態鏈接的一個必要條件。
二.接口
對于com來講,接口是一個包含一個函數指針數組的內存結構。每一個數組元素包含的是一個由組件所實現的函數地址。對于com而言,接口就是此內存結構,其他東西;均是com不關心的實現細節。
在c++中,可以用抽象基類來實現com接口。由于一個com組件可以實現支持任意數目的接口,因此對于這樣的組件,可以用抽象基類的多重繼承來實現。用類來實現組件將比其他方法更為容易。
對于客戶來說,一個組件就是一個接口集。客戶只能通過接口才能和com組件打交道。從整體上講,客戶對于一個組件可以說是知之甚少的。通常情況下,客戶甚至不必知道一個組件所提供的所有接口。
客戶同組件的交互是通過接口完成的。在客戶查詢組件其他的接口時,也是通過接口完成的。這個接口就是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。可以用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沒有給客戶提供一種能控制組件創建過程的方法,缺乏一定的靈活性。事實上,常用類廠來創建組件。類廠就是一個帶有能夠創建其他組件的接口的組件。客戶先創建類廠本身,然后再用一個接口(如iclassfactory)來創建所需的組件。然后還要用dllregistersever在windows中注冊這個組件。
四.復用
com組件可以被復用,它支持“接口繼承”。這種繼承指的是一個類繼承其基類的類型或接口。抽象基類是一種最純粹的接口繼承,并且正好也被用來實現com接口。在com中,我們可以用包容和聚合來對組件進行改造。
包容是在接口級完成的。外部組件包含指向內部接口的指針。此時,外部組件僅僅是內部組件的一個客戶而已,它將使用內部組件的接口來實現它自己的接口。外部組件也可以通過將調用轉發給內部組件的方法來重新實現內部組件所支持的某個接口。并且外部組件還可以在內部組件代碼的前后加上一些代碼以對接口進行改造。
聚合是包含的一種變化形式。當外部組件聚合了某個內部組件的一個接口時,它并沒有象包容那樣重新實現此接口并顯式的將調用請求轉發給內部組件。相反,外部組件直接把內部組件的接口指針返回給客戶。使用這種方法,外部組件將無需重新實現并轉發接口中的所有函數了。
包容和聚合為實現組件的復用提供了一種極具魯棒性的機制。在組件構架下,客戶于組件的實現完全隔離開了。
五.小結
以上是關于com的一些基礎知識。遵循com規范編寫的組件將會極大的改變傳統的軟件生產方式,具有廣闊的發展前景。這也將為軟件工程學引入新的內容和方法。
聲明:本文轉載自http://iask.sina.com.cn/b/10106948.html
(com),是微軟公司為了計算機工業的軟件生產更加符合人類的行為方式開發的一種新的軟件開發技術。在com構架下,人們可以開發出各種各樣的功能專一的組件,然后將它們按照需要組合起來,構成復雜的應用系統。由此帶來的好處是多方面的:可以將系統中的組件用新的替換掉,以便隨時進行系統的升級和定制;可以在多個應用系統中重復利用同一個組件;可以方便的將應用系統擴展到網絡環境下;com與語言,平臺無關的特性使所有的程序員均可充分發揮自己的才智與專長編寫組件模塊;等等。
com是開發軟件組件的一種方法。組件實際上是一些小的二進制可執行程序,它們可以給應用程序,操作系統以及其他組件提供服務。開發自定義的com組件就如同開發動態的,面向對象的api。多個com對象可以連接起來形成應用程序或組件系統。并且組件可以在運行時刻,在不被重新鏈接或編譯應用程序的情況下被卸下或替換掉。microsoft的許多技術,如activex, directx以及ole等都是基于com而建立起來的。并且microsoft的開發人員也大量使用com組件來定制他們的應用程序及操作系統。
com所含的概念并不止是在microsoft windows操作系統下才有效。com并不是一個大的api,它實際上象結構化編程及面向對象編程方法那樣,也是一種編程方法。在任何一種操作系統中,開發人員均可以遵循“com方法”。
一個應用程序通常使由單個的二進制文件組成的。當編譯器生成應用程序之后,在對下一個版本重新編譯并發行新生成的版本之前,應用程序一般不會發生任何變化。操作系統,硬件及客戶需求的改變都必須等到整個應用程序被重新生成。
目前這種狀況已經發生變化。開發人員開始將單個的應用程序分隔成單獨多個獨立的部分,也既組件。這種做法的好處是可以隨著技術的不斷發展而用新的組件取代以有的組件。此時的應用程序可以隨新組件不斷取代舊的組件而漸趨完善。而且利用已有的組件,用戶還可以快速的建立全新的應用。
傳統的做法是將應用程序分割成文件,模塊或類,然后將它們編譯并鏈接成一個單模應用程序。它與組件建立應用程序的過程(稱為組件構架)有很大的不同。一個組件同一個微型應用程序類似,即都是已經編譯鏈接好并可以使用的二進制代碼,應用程序就是由多個這樣的組件打包而得到的。單模應用程序只有一個二進制代碼模塊。自定義組件可以在運行時刻同其他的組件連接起來以構成某個應用程序。在需要對應用程序進行修改或改進時,只需要將構成此應用程序的組件中的某個用新的版本替換掉即可。
com,即組件對象模型,是關于如何建立組件以及如何通過組件建立應用程序的一個規范,說明了如何可動態交替更新組件。
使用組件的優點:
組件架構的一個優點就是應用可以隨時間的流逝而發展進化。除此之外,使用組件還有一些可以使對以有應用的升級更加方便和靈活的優點,如應用的定制,組件庫以及分布式組件等。
使用組件的種種優點直接來源于可以將它們動態的插入或卸出應用。為了實現這種功能,所有的組件必須滿足兩個條件:第一,組件必須動態鏈接;第二,它們必須隱藏(或封裝)其內部實現細節。動態鏈接對于組件而言是一個至關重要的要求,而消息隱藏則是動態鏈接的一個必要條件。
二.接口
對于com來講,接口是一個包含一個函數指針數組的內存結構。每一個數組元素包含的是一個由組件所實現的函數地址。對于com而言,接口就是此內存結構,其他東西;均是com不關心的實現細節。
在c++中,可以用抽象基類來實現com接口。由于一個com組件可以實現支持任意數目的接口,因此對于這樣的組件,可以用抽象基類的多重繼承來實現。用類來實現組件將比其他方法更為容易。
對于客戶來說,一個組件就是一個接口集。客戶只能通過接口才能和com組件打交道。從整體上講,客戶對于一個組件可以說是知之甚少的。通常情況下,客戶甚至不必知道一個組件所提供的所有接口。
客戶同組件的交互是通過接口完成的。在客戶查詢組件其他的接口時,也是通過接口完成的。這個接口就是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。可以用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沒有給客戶提供一種能控制組件創建過程的方法,缺乏一定的靈活性。事實上,常用類廠來創建組件。類廠就是一個帶有能夠創建其他組件的接口的組件。客戶先創建類廠本身,然后再用一個接口(如iclassfactory)來創建所需的組件。然后還要用dllregistersever在windows中注冊這個組件。
四.復用
com組件可以被復用,它支持“接口繼承”。這種繼承指的是一個類繼承其基類的類型或接口。抽象基類是一種最純粹的接口繼承,并且正好也被用來實現com接口。在com中,我們可以用包容和聚合來對組件進行改造。
包容是在接口級完成的。外部組件包含指向內部接口的指針。此時,外部組件僅僅是內部組件的一個客戶而已,它將使用內部組件的接口來實現它自己的接口。外部組件也可以通過將調用轉發給內部組件的方法來重新實現內部組件所支持的某個接口。并且外部組件還可以在內部組件代碼的前后加上一些代碼以對接口進行改造。
聚合是包含的一種變化形式。當外部組件聚合了某個內部組件的一個接口時,它并沒有象包容那樣重新實現此接口并顯式的將調用請求轉發給內部組件。相反,外部組件直接把內部組件的接口指針返回給客戶。使用這種方法,外部組件將無需重新實現并轉發接口中的所有函數了。
包容和聚合為實現組件的復用提供了一種極具魯棒性的機制。在組件構架下,客戶于組件的實現完全隔離開了。
五.小結
以上是關于com的一些基礎知識。遵循com規范編寫的組件將會極大的改變傳統的軟件生產方式,具有廣闊的發展前景。這也將為軟件工程學引入新的內容和方法。
聲明:本文轉載自http://iask.sina.com.cn/b/10106948.html
轉載于:https://www.cnblogs.com/cdts_change/archive/2009/09/18/1569730.html
總結
以上是生活随笔為你收集整理的组件对象模型:COM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十句常用语
- 下一篇: 由《我也能做CTO》引起的作者与读者的交