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