傅艷杰
(中國鐵通集團(tuán)有限公司 通化分公司, 吉林 通化 135100)
近年來以建立在ActiveX、OLE的基礎(chǔ)之上的組件對(duì)象模型COM(Component Object Model)與分布式組件對(duì)象模型DCOM(Distributed Component Object Model)之上的分布式組件技術(shù),能夠較好地在Internet平臺(tái)及其分布式結(jié)構(gòu)下解決這類問題。有關(guān)COM、改進(jìn)COM+以及DCOM的跟蹤研究文獻(xiàn)有許多報(bào)道,如COM、改進(jìn)COM+的高級(jí)編程應(yīng)用[1]以及分布式數(shù)據(jù)庫的一般應(yīng)用[2]、異構(gòu)分布式數(shù)據(jù)庫的互操作技術(shù)[3]、多數(shù)據(jù)庫系統(tǒng)的集成或聯(lián)合[4-5]、分布式隨機(jī)庫存的管理等[6],但對(duì)于遠(yuǎn)程通訊中的客戶端請(qǐng)求和服務(wù)器組件對(duì)象的相互通訊仍缺乏具體的實(shí)例。
基于此,本文對(duì)遠(yuǎn)程通訊分布式計(jì)算過程中的COM與DCOM分布式組件的實(shí)現(xiàn)過程進(jìn)行分析與研究。由于COM與DCOM分布式組件具有與語言無關(guān)、進(jìn)程透明、可重用的一系列組件程序共同規(guī)范,使得在分布式計(jì)算的應(yīng)用場(chǎng)合日益得到推廣?;谕ㄓ嵲鲋禈I(yè)務(wù)的技術(shù)角度而言,當(dāng)硬件條件基本不變的情況下,COM與DCOM分布式組件技術(shù)就有了高度的研究空間,可以視為解決遠(yuǎn)程通訊分布式計(jì)算的關(guān)鍵問題。
在技術(shù)的時(shí)序上,作為分布式組件技術(shù)的前沿DCOM是奠基于COM及COM+規(guī)范,特別是COM接口及COM接口的繼承、組件的客戶程序、組件與組件之間及組件與客戶之間的接口交互、抽象基類、實(shí)現(xiàn)類等諸多關(guān)鍵內(nèi)容,這些內(nèi)容均為當(dāng)前頗為關(guān)鍵的DCOM分布式組件計(jì)算問題。而在技術(shù)的繼承上,COM與DCOM分布式組件是配合于結(jié)構(gòu)中每個(gè)節(jié)點(diǎn)之上,包括前身的WINDOWS API(Application Programming Interface)接口與ActiveX控件技術(shù),它們共同支撐著分布式計(jì)算以及并行計(jì)算的實(shí)現(xiàn)過程。
與分布式的COM組件技術(shù)相對(duì)應(yīng)的是此前應(yīng)用較為廣泛的WINDOWS API接口技術(shù),后者是一種平面式的交互結(jié)構(gòu)。在32位面向?qū)ο笳Z言環(huán)境中,自動(dòng)化(Automation)、ActiveX控制以及封裝后控件的能力體現(xiàn)了語言的效率,像VC、VB、VFP等都可以在工程中使用Microsoft提供的控件,也可以在工程中引入來自第三方的控件,均可以ActiveX或動(dòng)態(tài)鏈接庫DLL的形式加以體現(xiàn)。但由于自動(dòng)化(Automation)、ActiveX控制等掩蓋了組件的底層結(jié)構(gòu),軟件人員很能控制組件的行為,在組件重用及程序交互等方面帶來了一系列的問題,這此問題使得WINDOWS API組件程序的平面式交互結(jié)構(gòu)難以擴(kuò)展,至少在項(xiàng)目開發(fā)的速度以及技術(shù)的延展上無法令人滿意。
在遠(yuǎn)程通訊分布式環(huán)境下,接口函數(shù)的龐雜性極大地限制了組件的易用性,包括前身的WINDOWS API接口與ActiveX控件技術(shù)均如此。對(duì)多個(gè)32位應(yīng)用程序而言,根據(jù)需要可能訪問WINDOWS操作系統(tǒng)的底層技術(shù),如驅(qū)動(dòng)硬件、WINDOWS消息機(jī)制等,此時(shí),有可能要共用到一個(gè)組件,常規(guī)的做法是通過Microsoft提供的動(dòng)態(tài)鏈接庫DLL中的WINDOWS API接口函數(shù)來實(shí)現(xiàn),即以WINDOWS API作為組件接口。但由于Microsoft提供的WINDOWS API接口函數(shù)共達(dá)300多個(gè),即使一般硬件廠商提供的作為二次開發(fā)的接口軟件包SDK也至少包含數(shù)十個(gè)函數(shù),編程的接口面比較寬,開發(fā)人員掌握和使用起來都比較困難。
WINDOWS API接口規(guī)范受語言環(huán)境的限制較多,不利于遠(yuǎn)程通訊中的應(yīng)用程序交互。由于不同的32位面向?qū)ο笳Z言對(duì)WINDOWS API接口函數(shù)的調(diào)用形式是不同的,如在VC、VB、VFP語言環(huán)境中,調(diào)用同一個(gè)動(dòng)態(tài)鏈接庫DLL中的WINDOWS API接口函數(shù),參數(shù)的傳遞順序、參數(shù)類型、函數(shù)返回值及調(diào)用的形式都有所不同。如果不同的應(yīng)用系統(tǒng)采用了不同的開發(fā)語言,則應(yīng)用程序之間的相互通訊將成為技術(shù)障礙,導(dǎo)致若干獨(dú)立的應(yīng)用系統(tǒng)成為“信息孤島”,使得遠(yuǎn)程通訊分布式計(jì)算過程中的信息融合變得十分困難。
在WINDOWS API組件程序的平面式交互結(jié)構(gòu)中,出于技術(shù)考慮而多采用封裝控件的形式,如ActiveX控件等皆以此技術(shù)對(duì)底層結(jié)構(gòu)進(jìn)行掩蓋。除卻技術(shù)保護(hù)而言,ActiveX控制掩蓋了底層結(jié)構(gòu)不利于在遠(yuǎn)程通訊分布式計(jì)算中具體應(yīng)用。因?yàn)樵谶h(yuǎn)程通訊分布式實(shí)際應(yīng)用中,不僅限于對(duì)組件的使用,軟件人員需要掌握組件的底層知識(shí),一旦組件發(fā)生了底層錯(cuò)誤,軟件人員需要對(duì)組件的行為進(jìn)行分析,以查找錯(cuò)誤予以修正。但類似ActiveX控制的形式,在一定程度上限制了這種可能。
總體而言,平面式結(jié)構(gòu)的WINDOWS API接口是定義在源代碼級(jí),而COM接口是定義在二進(jìn)制級(jí),所表現(xiàn)出來的性能差異很大,它可以從VC、VB、VFP的開發(fā)環(huán)境遷移到VC#開發(fā)平臺(tái)而獲得直觀驗(yàn)證。
由Microsoft提出的基于WINDOWS平臺(tái)上的組件對(duì)象模型COM與分布式組件對(duì)象模型DCOM,與OMG提出的基于UNIX平臺(tái)上的公共對(duì)象請(qǐng)求中介體系結(jié)構(gòu)(Common Object Request Breaker Architecture)相類似,它規(guī)定了組件程序的共同規(guī)范以及組件程序之間進(jìn)行交互的共同標(biāo)準(zhǔn)。
COM與DCOM分布式組件技術(shù)建立在ActiveX、OLE的基礎(chǔ)之上,其基本思想是將大而復(fù)雜的軟件應(yīng)用分成一系列的可先行實(shí)現(xiàn)、易于開發(fā)、理解和調(diào)整的軟件單元,也就是通常定義的組件。以COM與DCOM分布式組件為基礎(chǔ)的軟件解決方案,不僅效率高、花費(fèi)低,而且有利于在計(jì)算機(jī)業(yè)、通訊業(yè)形成軟件開發(fā)的規(guī)模效益,特別適于開發(fā)分布式計(jì)算軟件系統(tǒng)。
應(yīng)用COM與DCOM分布式組件與簡單地應(yīng)用WINDOWS API編程不同,它可以在分布式計(jì)算的開發(fā)上具有較大的技術(shù)優(yōu)勢(shì),在分布式計(jì)算過程中至少表現(xiàn)為下列幾個(gè)方面:
一是COM與DCOM組件縮短了開發(fā)時(shí)間。編程人員可將先行開發(fā)的許多部件裝配到新的程序中,顯著加快新程序的開發(fā)速度。
二是降低了集成費(fèi)用。在將COM與DCOM組件集成為一個(gè)完整的系統(tǒng)方案時(shí),不同的開發(fā)商采用了一致的COM標(biāo)準(zhǔn)接口,如此可減少特殊的定制工作。
三是系統(tǒng)開發(fā)更具靈活性。開發(fā)人員只需簡單調(diào)整全部應(yīng)用的一些COM與DCOM組件,即可為不同領(lǐng)域的應(yīng)用項(xiàng)目提供特定的解決方案。
四是降低了軟件維護(hù)的費(fèi)用。在設(shè)計(jì)分布式計(jì)算的過程中,遠(yuǎn)程通訊是首要考慮的問題,此時(shí)各個(gè)COM與DCOM組件的軟件功能是相對(duì)獨(dú)立的,在維護(hù)和升級(jí)一個(gè)COM與DCOM組件時(shí),不必變動(dòng)整個(gè)應(yīng)用項(xiàng)目,如此降低了相關(guān)的費(fèi)用,使通訊維護(hù)工作變得更為簡潔與輕便。此外,COM與DCOM組件的分布性(Distribution)與可重用性(Reusability)的特性也發(fā)揮了突出的作用,這種特點(diǎn)使得利用COM與DCOM組件結(jié)構(gòu)開發(fā)分布式計(jì)算軟件時(shí),可以成倍地提高工作的效率,使開發(fā)的工期大為縮短。
從遠(yuǎn)程客戶端來看,COM與DCOM組件的表現(xiàn)形式是以EXE、DLL為擴(kuò)展名儲(chǔ)存的,需要依靠操作系統(tǒng)的調(diào)度,才能夠以進(jìn)程內(nèi)例程或進(jìn)程外例程的方式加載執(zhí)行。雖然具體的語言中,也有通過控件的方式出現(xiàn)的,如VB中的OCX、VFP中的VCX等,但依據(jù)COM與DCOM的接口規(guī)范,組件應(yīng)與語言無關(guān),故要求組件之間通過接口來互訪,接口僅提供參數(shù)、返回值等信息供組件調(diào)用,即組件的設(shè)計(jì)過程應(yīng)跨越語言平臺(tái)。
下例是本文采用COM與DCOM接口繼承設(shè)計(jì)的含兩個(gè)接口fyj1和fyj2的組件fyj。
// 自編接口fyj1
interface fyj1
{ virtual void _stdcall HN1() = 0;
virtual void _stdcall HN2() = 0;
};
//自編接口fyj 2
interface fyj2
{ virtual void _stdcall HN3() = 0;
virtual void _stdcall HN4() = 0;
};
// 實(shí)現(xiàn)類--組件fyj
class fyj
{ public:
……
};
由于COM與DCOM是基于客戶和服務(wù)器模型的,客戶端和服務(wù)器組件對(duì)象的交流是通過COM與DCOM組件技術(shù)加以實(shí)現(xiàn)的,客戶端僅是建立對(duì)象的實(shí)例,而服務(wù)器端才是負(fù)責(zé)接收和處理來自客戶的各種請(qǐng)求的對(duì)象,故構(gòu)造COM與DCOM分布式組件fyj之后,即可交由客戶建立使用對(duì)象的實(shí)例,以在遠(yuǎn)程通訊分布式環(huán)境中加以具體引用,而不必考慮何種具體的開發(fā)語言。
遠(yuǎn)程通訊中的分布式計(jì)算環(huán)境相當(dāng)于DCOM、COM及COM+之上添加了網(wǎng)絡(luò)協(xié)議,使得COM對(duì)象可在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行,運(yùn)行環(huán)境會(huì)自動(dòng)確認(rèn)是否允許訪問遠(yuǎn)程對(duì)象。用戶的感覺是COM對(duì)象的運(yùn)行如同發(fā)生于本地機(jī)一樣,而運(yùn)行的性能取決于網(wǎng)絡(luò)環(huán)境。特別是基于并發(fā)及CPU多線程技術(shù)的支持,COM與DCOM分布式組件的應(yīng)用都為分布式計(jì)算及并行計(jì)算提供了良好的技術(shù)解決方案,使敏捷開發(fā)更加廣泛地出現(xiàn)于計(jì)算機(jī)通訊。
[參考文獻(xiàn)]
[1] Randy Abernethy.COM與DCOM技術(shù)內(nèi)幕[M].北京:電子工業(yè)出版社,2000.
[2] 董少英.基于COM/DCOM的分布式數(shù)據(jù)庫系統(tǒng)的研究[J].信息與電腦,2011(6):155-156.
[3] 吳超.基于COM/DCOM的異構(gòu)分布式數(shù)據(jù)互操作技術(shù)研究[D].西安:西北工業(yè)大學(xué)碩士學(xué)位論文,2003.
[4] 陶昕,謝昕.基于COM/DCOM集成的多數(shù)據(jù)庫系統(tǒng)的研究與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2011(6):206-207.
[5] 施媛波.基于COM的多數(shù)據(jù)庫聯(lián)合系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)[J].煤炭技術(shù),2011(3):165-166.
[6] 沈晟,沈炳炎.基于DCOM/COM+的分布式隨機(jī)庫存管理系統(tǒng)應(yīng)用研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,28(12):2951-2956.