什么是COM?
學習啦小編總結了關于COM術語的一些資料,供大家參考!
什么是COM術語
隨著計算機網(wǎng)絡的飛速發(fā)展,軟件的應用環(huán)境變得更加廣闊;與此同時,軟件的設計難度也在提高。為適應這種分布式軟件應用環(huán)境,組件化程序設計思想迅速地發(fā)展起來。組件化程序設計思想,即復雜的應用程序被設計成一些小的、功能單一的組件模塊,這些組件模塊可以運行在同一太機器上,也可以運行在不同的機器上,甚至機器的運行環(huán)境也可以不同。
為此,OMG (Object Management Group,對象管理組織)提出了CORBA (Common Object Request Breaker Architecture,公共對象請求中介體系結構),而微軟提出了COM (Component Object Model,組件對象模型)標準。目前,CORBA模型主要應用于UNIX操作系統(tǒng)平臺上,而COM主要應用于Microsoft Windows操作系統(tǒng)平臺上。
COM的特性:語言無關性、進程透明性、可重用性。
1. 語言無關性:COM是二進制代碼級的標準。COM規(guī)范的定義不依賴于任何特定的語言。不同語言開發(fā)的COM對象可以交互、共享;而面向?qū)ο缶幊?OOP, Object-oriented Programming)語言定義的對象,只能在同種語言中被重用。實際上,可以使用OOP編程技術來開發(fā)COM組件,這兩種技術是互補的。所有編程語言中,與COM規(guī)范最貼近的要數(shù)C++,所以,要想深刻理解COM,一定要有C++編程基礎。
2. 進程透明性:COM提供的服務組件對象在實現(xiàn)時有兩種進程模型:進程內(nèi)對象和進程外對象。前者通常以DLL的形式,在客戶進程空間中運行;后者通常以EXE的形式,運行在同一機器的另一個進程空間中,或遠程機器的一個進程空間中(此時,COM對象也可能是以DLL形式提供服務,而遠程機為其創(chuàng)建一個代理進程)。雖然COM對象有以上幾種不同的進程模型,但這些區(qū)別對于客戶程序來說是透明的??蛻舫绦蛑灰裾誄OM規(guī)范操作COM對象即可,完全不必理會COM對象的進程模型。然而,我們在開發(fā)COM組件時,還是要慎重選擇進程模型的。一般來說,進程內(nèi)模型效率高一點,但組件如果不穩(wěn)定會危及客戶進程;進程外模型穩(wěn)定性好,但運行時的系統(tǒng)開銷比較大,效率相對低一點。
3. 可重用性:COM對象的可重用性與一般的面向?qū)ο笳Z言實現(xiàn)的對象的重用過程是不同的。COM對象的重用性建立在對象的行為方式上,而不是具體的實現(xiàn)上。COM有兩種機制實現(xiàn)對象的重用:包容和聚合。假設A為外部對象,B為內(nèi)部對象。包容方式,即A實現(xiàn)了B上的所有接口方法,而在實際接口方法調(diào)用時,A只是簡單地調(diào)用B相應的接口方法;而聚合方式,A不實現(xiàn)B的接口,而是把B的接口直接暴露給客戶,但A保證客戶不會知道有內(nèi)部對象B的存在。
COM對象與C++對象的比較:
1. COM對象對對象上的數(shù)據(jù)實現(xiàn)完全封裝,外部如果想訪問對象的數(shù)據(jù),必須通過COM對象提供的接口方法。而C++對象的數(shù)據(jù)有可能被外部直接訪問。C++語言對類的成員進行了訪問控制,public成員可以在對象外部直接訪問。
2. COM對象的可重用性表現(xiàn)在COM對象的包容和聚合,一個對象可以完全使用另一個對象的所有功能;而C++對象的可重用表現(xiàn)在C++類的繼承,派生類可以訪問其父類的非私有屬性、調(diào)用非私有成員函數(shù)。雖然C++和COM的重用性機制不同,但我們可以把這兩種技術有機結合起來:在源代碼級使用C++的類重用性,在組件一級使用COM的重用性。
3. 多態(tài)性使得客戶程序可以通過統(tǒng)一的方法,來處理不同的對象。C++對象通過虛函數(shù)實現(xiàn)多態(tài)性,而COM對象的多態(tài)性通過接口來體現(xiàn)。
COM對象通過CLSID(一個128位的數(shù)串,如{54BB7788-0008-7789-ABAB-112233445566},也可以稱為UUID或GUID)來唯一標示。我們通過這個CLSID,就可以創(chuàng)建對應的COM對象(調(diào)用函數(shù)CoCreateInstance)。CLSID可以通過工具UUIDGen.exe或GUIDGen.exe來隨機產(chǎn)生。GUID不僅可以用來標示COM對象,也可以用來標示COM對象上實現(xiàn)的各個接口(QueryInterface調(diào)用時需要這個接口的GUID)。