學(xué)習(xí)啦>學(xué)習(xí)電腦>網(wǎng)絡(luò)知識>網(wǎng)絡(luò)基礎(chǔ)知識>

什么是COM?

時間: 春健736 分享

  學(xué)習(xí)啦小編總結(jié)了關(guān)于COM術(shù)語的一些資料,供大家參考!

  什么是COM術(shù)語

  隨著計算機網(wǎng)絡(luò)的飛速發(fā)展,軟件的應(yīng)用環(huán)境變得更加廣闊;與此同時,軟件的設(shè)計難度也在提高。為適應(yīng)這種分布式軟件應(yīng)用環(huán)境,組件化程序設(shè)計思想迅速地發(fā)展起來。組件化程序設(shè)計思想,即復(fù)雜的應(yīng)用程序被設(shè)計成一些小的、功能單一的組件模塊,這些組件模塊可以運行在同一太機器上,也可以運行在不同的機器上,甚至機器的運行環(huán)境也可以不同。

  為此,OMG (Object Management Group,對象管理組織)提出了CORBA (Common Object Request Breaker Architecture,公共對象請求中介體系結(jié)構(gòu)),而微軟提出了COM (Component Object Model,組件對象模型)標準。目前,CORBA模型主要應(yīng)用于UNIX操作系統(tǒng)平臺上,而COM主要應(yīng)用于Microsoft Windows操作系統(tǒng)平臺上。

  COM的特性:語言無關(guān)性、進程透明性、可重用性。

  1. 語言無關(guān)性:COM是二進制代碼級的標準。COM規(guī)范的定義不依賴于任何特定的語言。不同語言開發(fā)的COM對象可以交互、共享;而面向?qū)ο缶幊?OOP, Object-oriented Programming)語言定義的對象,只能在同種語言中被重用。實際上,可以使用OOP編程技術(shù)來開發(fā)COM組件,這兩種技術(shù)是互補的。所有編程語言中,與COM規(guī)范最貼近的要數(shù)C++,所以,要想深刻理解COM,一定要有C++編程基礎(chǔ)。

  2. 進程透明性:COM提供的服務(wù)組件對象在實現(xiàn)時有兩種進程模型:進程內(nèi)對象和進程外對象。前者通常以DLL的形式,在客戶進程空間中運行;后者通常以EXE的形式,運行在同一機器的另一個進程空間中,或遠程機器的一個進程空間中(此時,COM對象也可能是以DLL形式提供服務(wù),而遠程機為其創(chuàng)建一個代理進程)。雖然COM對象有以上幾種不同的進程模型,但這些區(qū)別對于客戶程序來說是透明的。客戶程序只要遵照COM規(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)對象的重用:包容和聚合。假設(shè)A為外部對象,B為內(nèi)部對象。包容方式,即A實現(xiàn)了B上的所有接口方法,而在實際接口方法調(diào)用時,A只是簡單地調(diào)用B相應(yīng)的接口方法;而聚合方式,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的重用性機制不同,但我們可以把這兩種技術(shù)有機結(jié)合起來:在源代碼級使用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)建對應(yīng)的COM對象(調(diào)用函數(shù)CoCreateInstance)。CLSID可以通過工具UUIDGen.exe或GUIDGen.exe來隨機產(chǎn)生。GUID不僅可以用來標示COM對象,也可以用來標示COM對象上實現(xiàn)的各個接口(QueryInterface調(diào)用時需要這個接口的GUID)。

585305