版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
GIS技術(shù)
第一部分:組件技術(shù)
1.概述
組件的起源
組件的發(fā)展
組件技術(shù)現(xiàn)狀
2.組件技術(shù)原理
組件基礎(chǔ)知識
基本概念
對象與接口
組件應(yīng)用模型
組件復(fù)用技術(shù)
組件技術(shù)的應(yīng)用
基于組件的應(yīng)用技術(shù)
多層軟件結(jié)構(gòu)
高級組件技術(shù)(com+dcommts)
3.組件開發(fā)
4.組件的使用
5.組件技術(shù)與GIS
6.MapObject
第二部分:網(wǎng)絡(luò)技術(shù)
1.計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)
2.分布式GIS
3.WEBGIS
WEBGIS基本概念
WEBGIS主要特點(diǎn)
主要webGIS系統(tǒng)平臺介紹
WEBGIS原理及相關(guān)技術(shù)
第三部分:空間數(shù)據(jù)庫技術(shù)
1.空間數(shù)據(jù)庫簡介
2.空間概念和數(shù)據(jù)模型
3.空間查詢與空間索引
4.基于WEB的空間數(shù)據(jù)庫系統(tǒng)
5.空間數(shù)據(jù)挖掘簡介
6.空間數(shù)據(jù)庫發(fā)展趨勢
第四部分:地形三維可視技術(shù)
1.概述
2.地形三維顯示的基本過程
地形三維顯示中的數(shù)據(jù)準(zhǔn)備
地形表面擬合
投影變換
消隱與裁剪
紋理映射
光照模型
3.OpenGL
目錄
目錄3
第一篇:組件對象模型(COM)7
第一章:COM概述8
1.1COM的起源8
1.1.1COM的發(fā)展簡史8
1.1.2組件的產(chǎn)生9
1.2使用組件的優(yōu)點(diǎn)1()
1.3COM特性10
1.3.1面向?qū)ο蟮慕M件模型一COM11
132客戶/服務(wù)器模型11
1.3.3語言無關(guān)性12
1.3.4進(jìn)程透明特性13
1.3.5可重用性13
1.4與COM相關(guān)的技術(shù)14
1.4.1ActiveX14
1.4.2DCOM14
1.4.3COM+14
1.5COM應(yīng)用15
1.5.1COM在Windows操作系統(tǒng)中的應(yīng)用15
1.5.2COM在數(shù)據(jù)庫領(lǐng)域的應(yīng)用15
1.5.3COM在企業(yè)中應(yīng)用15
1.5.4COM在Internet中的應(yīng)用16
第二章組件技術(shù)原理17
2.1對象與接口17
2.1.1COM對象17
2.1.2COM接口18
2.1.3全局唯一標(biāo)識符——GUID19
2.1.4接口定義語言IDL19
2.2組件應(yīng)用模型21
2.2.1客戶/服務(wù)器模型21
2.2.2COM庫22
2.2.3通過注冊表管理COM對象23
2.2.4COM客戶對組件的調(diào)用25
2.3組件復(fù)用技術(shù)26
2.3.1組件的聚合26
2.3.2組件的包容26
第三章用VC++開發(fā)COM組件27
3.1基于MFC開發(fā)COM組件27
3.1.1MFC開發(fā)COM組件概述27
3.1.2用MFC開發(fā)COM組件例程28
3.2基于ATL開發(fā)COM組件31
3.2.1ATL開發(fā)COM組件概述31
3.2.2用ATL開發(fā)COM組件例程32
第四章VC++中使用代碼組件36
4.1.相關(guān)基礎(chǔ)知識36
4.1.1組件的安裝和注冊36
4.1.2類型庫與ODL37
4.1.3OLE/COMObjectView38
4.2在VC++中使用代碼組件39
4.2.1利用COM庫使用代碼組件39
4.2.2利用ClassWizard庫使用代碼組件41
4.2.3利用#import使用代碼組件42
第五章組件技術(shù)與GIS43
5.1組件式GIS系統(tǒng)的特點(diǎn)44
5.2組件式GIS的結(jié)構(gòu)45
5.2.1組件式GIS的體系結(jié)構(gòu)45
5.2.2組件層次劃分47
5.2.3組件功能劃分48
5.4GIS組件產(chǎn)品及比較53
第六章MapObject53
第二篇:空間數(shù)據(jù)庫訪問技術(shù)54
第一章空間數(shù)據(jù)庫簡介55
1.1空間數(shù)據(jù)庫55
1.1.1空間數(shù)據(jù)庫與地理信息系統(tǒng)55
1.1.2空間數(shù)據(jù)庫的發(fā)展56
1.2基于關(guān)系數(shù)據(jù)庫的空間數(shù)據(jù)庫管理系統(tǒng)57
1.2.1采用關(guān)系數(shù)據(jù)庫的優(yōu)點(diǎn)57
1.2.2基于關(guān)系數(shù)據(jù)庫的GIS模型58
第二章空間數(shù)據(jù)庫訪問59
2.1采用ADO訪問空間數(shù)據(jù)庫59
2.1.1ADO對象模型59
2.1.2在VisualC++中使用ADO61
2.1.3在VisualC++中使用ADO(例程)67
2.2采用ODBC接口實(shí)現(xiàn)多數(shù)據(jù)庫支持72
2.2.1ODBC基本概念:72
2.2.2ODBC組成:72
2.2.3ODBC在GIS中的意義73
2.2.4設(shè)置ODBC數(shù)據(jù)源74
第三篇WebGIS77
第一章GIS與Internet.WorldWideWeb78
1.1Internet——巨大的信息庫78
1.2WWW——Internet成功的關(guān)鍵因素79
1.3Intranet日益興起79
1.4Internet、WWW對GIS的影響80
第二章WebGIS概述8()
2.1WebGIS的概念80
2.2WebGIS與傳統(tǒng)GIS的比較81
2.3WebGIS的體系結(jié)構(gòu)82
2.4WebGIS的基本工作模式和分類83
第三章WebGIS中的WWW技術(shù)85
3.1WebGIS瀏覽器85
3.2.客戶端與服務(wù)端通訊方式和接口設(shè)計(jì)86
3.2.1通用網(wǎng)關(guān)接口(CGI)/服務(wù)器應(yīng)用程序接口方法(SAPI)86
3.2.2插入法(Plug-in)88
3.2.3JavaApplet/ActiveX89
3.2.4綜合性的技術(shù)方法90
第四章WebGIS實(shí)現(xiàn)92
4.1MapXtreme簡介92
4.1.1MapXtreme引擎92
4.1.2MapXtreme構(gòu)成93
4.1.3MapXtreme月艮務(wù)器酉己置93
4.1.4MapXtreme應(yīng)用程序的工作流程97
4.1.5MpXtreme數(shù)據(jù)98
4.2MapXtreme系統(tǒng)開發(fā)構(gòu)架99
4.2.1開發(fā)構(gòu)架基本概述99
4.2.2初始化地圖服務(wù)器100
4.2.3客戶端向地圖服務(wù)器提交請求102
4.2.4地圖服務(wù)器處理客戶請求104
4.2.5將處理結(jié)果輸出給客戶端105
4.2.6釋放地圖服務(wù)資源105
第一篇:組件對象模型(COM)
第一章:COM概述
組件式是當(dāng)前軟件技術(shù)發(fā)展的潮流之一。它的優(yōu)點(diǎn)是具有高度的重用性和互用性,涉及到
應(yīng)用程序構(gòu)成的各個方面,對應(yīng)用程序的開發(fā)產(chǎn)生很大的影響。目前主要是基于Mircrosoft的
COM/DCOM規(guī)范業(yè)己成為業(yè)界的事實(shí)上的標(biāo)準(zhǔn)。本書中我們主要介紹Mircrosoft的COM組件
模型。
COM,即組件對象模型(ComponentObjectModel),是關(guān)于如何建立組件以及如何通過組
件架構(gòu)應(yīng)用程序的一個規(guī)范,是Mircrosoft創(chuàng)建的一種二進(jìn)制和網(wǎng)絡(luò)標(biāo)準(zhǔn),它允許任意兩個組
件之間互相通信,而不管它們是在什么計(jì)算機(jī)上運(yùn)行(只要計(jì)算機(jī)是相連的),不管各計(jì)算機(jī)運(yùn)
行的是什么操作系統(tǒng)(只要該操作系統(tǒng)支持COM),也不管該組件是用什么語言寫的。
1.1COM的起源
軟件工業(yè)的迅速發(fā)展,使得軟件的規(guī)模越做越大,功能越來越強(qiáng),版本的更新也越來越快。
這種變化對于傳統(tǒng)的軟件開發(fā)方式提出了新的挑戰(zhàn):
對于用戶而言:
為了使用軟件的少數(shù)幾項(xiàng)功能,而不得不購買整個鐵板一塊的應(yīng)用程序,不同的軟件的功
能大量重疊,造成資源的大量浪費(fèi)。
對于軟件開發(fā)商而言:
首先,軟件規(guī)模的不斷增大,使得開發(fā)團(tuán)隊(duì)也越來越大,團(tuán)隊(duì)的協(xié)調(diào)工作變得極其復(fù)雜,
應(yīng)用難以被集成;
其次,頻繁的軟件升級和改版使得軟件開發(fā)陷入不可維護(hù)的境地,傳統(tǒng)的軟件開發(fā)方式及
技術(shù)已經(jīng)越來越不能適應(yīng)軟件發(fā)展的需要。
因此,軟件行業(yè)迫切需要一種解決上述問題的新的方法和技術(shù)手段。COM技術(shù)正是在這種
情況下出現(xiàn)的。
1.1.1COM的發(fā)展簡史
任何一種技術(shù)從產(chǎn)生到成熟都有一個長期的發(fā)展歷程,作為組件化軟件模型,COM的發(fā)展
過程也不例外。本節(jié)對Mircrosoft的組件技術(shù)的發(fā)展過程進(jìn)行回顧。隨著桌面窗口系統(tǒng)中應(yīng)用
程序之間的交互不斷深入,就在OLE技術(shù)的發(fā)展過程中產(chǎn)生了COM。
從字面上來看,OLE所表達(dá)的是復(fù)合文檔(compounddocument)的概念,而且,OLE的第一
個版本即OLEI也僅限于此。需要指出的是,在OLEI中,組件程序和客戶程序之間進(jìn)行通信
并沒有使用COM規(guī)范,而是使用了一種被稱為動態(tài)數(shù)據(jù)交換(DDE,dynamicDataExchange)的
機(jī)制,DDE建立在Windows操作系統(tǒng)的消息機(jī)制基礎(chǔ)上,其最大的缺點(diǎn)是效率低,而且穩(wěn)定性
不好,使用也不夠方便。
DDE的這些缺陷也限制了OLE1的發(fā)展,于是,在第二個OLE版本即OLE2中,Microsoft
重新編寫了底層代碼,放棄了DDE,采用了新的COM模型,因此,OLE2成了第一個用COM
架構(gòu)的軟件系統(tǒng)。由于采用了COM,OLE2比OLE1效率更高,穩(wěn)定性和靈活性有了很大提
高。
在以后OLE的發(fā)展過程中,由于采用了COM作為其底層結(jié)構(gòu),使用COM接口(interface)
作為程序之間通信的標(biāo)準(zhǔn),因此,OLE模塊定制和擴(kuò)充變得非常方便。這里我順便提一下軟件
版本的升級方式。一般的應(yīng)用系統(tǒng)在升級版本時,往往用新的軟件模塊全部替換老的程序模塊,
因此,升級就意味著全部更新,例如OLE2對OLE1進(jìn)行升級,不僅軟件模塊作了替換,連基
本技術(shù)也變了。但是在OLE2之后,由于采用了組件化的軟件模型,因此,每一個底層模塊可
以單獨(dú)升級,而且在原來軟件模塊的基礎(chǔ)上,可以添加新的組件模塊而不需要改變原有的組件
模塊。因此,在OLE2之后,OLE技術(shù)不再局限于“對象鏈接和嵌入”,不再局限于復(fù)合文檔,
而變成了在桌面系統(tǒng)上進(jìn)行程序通信的一個技術(shù)統(tǒng)稱。因此,當(dāng)人們正在等待“OLE3”出現(xiàn)的
時候,OLE己經(jīng)不再是最初的OLE了。并且,用戶計(jì)算機(jī)中的OLE系統(tǒng)也正悄悄地在進(jìn)行更
新。
1.1.2組件的產(chǎn)生
在計(jì)算機(jī)軟件發(fā)展的早期,一個應(yīng)用程序通常是由單個的二進(jìn)制文件組成的。應(yīng)用越復(fù)雜,
程序就越龐大,系統(tǒng)開發(fā)的難度也就越大。而且,當(dāng)編譯器生成此應(yīng)用程序之后,在對下一版
本重新編譯并發(fā)行新生成的版本之前,應(yīng)用程序一般不會發(fā)生任何變化。操作系統(tǒng)、硬件及客
戶需求的改變都必須等到整個應(yīng)用程序被重新編譯之后才能夠得以認(rèn)可。而對于龐大的程序來
講,更新版本的周期很長,在兩個版本之間,如果由于操作系統(tǒng)發(fā)生了變化,或者硬件平臺有
了變化,則應(yīng)用系統(tǒng)就很難適應(yīng)這樣的變化。所以這類單體應(yīng)用程序已經(jīng)不能滿足計(jì)算機(jī)軟硬
件的發(fā)展需要。
目前這種狀況已經(jīng)發(fā)生了變化。人們認(rèn)識到應(yīng)用程序在發(fā)行之后不應(yīng)該保持那種靜止的狀
態(tài)。從軟件模型角度來考慮,一個很自然的想法就是把一個龐大的應(yīng)用程序分成多個模塊,每
一個模塊保持一定的功能獨(dú)立性,在協(xié)同工作時,通過相互之間的接口完成實(shí)際的任務(wù)。我們
把每一個這樣的模塊稱為組件(圖1
單個應(yīng)用程序組件應(yīng)用程序
圖I」傳統(tǒng)的應(yīng)用程序與組件應(yīng)用程序?qū)Ρ?/p>
一個設(shè)計(jì)良好的應(yīng)用系統(tǒng)往往被切分成一些組件,這些組件可以單獨(dú)開發(fā),單獨(dú)編譯,甚
至單獨(dú)調(diào)試和測試。當(dāng)所有的組件開發(fā)完成后,把它們組合在一起就得到了完整的應(yīng)用系統(tǒng)。
當(dāng)系統(tǒng)的外界軟硬件環(huán)境發(fā)生變化或者用戶的需求有所更改時,并不需要對所有的組件進(jìn)行修
改,而只需對受影響的組件進(jìn)行修改,然后重新組合得到新的升級軟件。圖1.2體現(xiàn)了這樣的
一個升級過程。
組件應(yīng)用程序
圖1.2組件應(yīng)用程序的升級
1.2使用組件的優(yōu)點(diǎn)
>應(yīng)用程序靈活、自由定制
用戶通常希望能夠按自己的需求和意愿來定制他們所用的應(yīng)用程序(如在Arcinfo中我們只
選用我們需要的模塊),以使應(yīng)用程序能夠按他們自己的需求和習(xí)慣那樣工作。
>應(yīng)用程序程序開發(fā)容易、快捷
采用組件架構(gòu)最引人注目的優(yōu)點(diǎn)之一是快速應(yīng)用程序開發(fā)。這一優(yōu)點(diǎn)可以使開發(fā)人員從某
個組件庫中取出所需的組件并將其快速地組裝到一塊以構(gòu)造所需的應(yīng)用程序,如同搭積木塊一
樣。
>網(wǎng)絡(luò)透明性
組件的易替換性和客戶機(jī)/服務(wù)器的特點(diǎn)使得在將已有應(yīng)用程序轉(zhuǎn)化成分布式應(yīng)用程序時,
若己有應(yīng)用程序是由組件組裝成的,那么轉(zhuǎn)化過程將會簡單得多。本地機(jī)器的應(yīng)用程序并不需
要知道實(shí)際所用到的組件到底在何處。類似地,遠(yuǎn)地組件也不需要知道它們是否位于遠(yuǎn)地。這
樣通過加人合適的遠(yuǎn)地組件,應(yīng)用程序完全不需要知道實(shí)際的組件到底在那里。
1.3COM特性
COM規(guī)范所定義的組件模型,主要有五個特性:面向?qū)ο蟮奶匦浴⒖蛻?服務(wù)器特性、語
言無關(guān)性、對進(jìn)程的透明性和它的可重用機(jī)制。
1.3.1面向?qū)ο蟮慕M件模型一COM
在上面論述中,我們主要講述了將應(yīng)用程序分解成組件的思想,忽略了組件與組件之間是
如何組合成一個功能完備的符合要求的應(yīng)用程序的方法。實(shí)際上,組件與組件之間的組合是通
過組件的接口,組件之間的接口是組件軟件的關(guān)鍵,因?yàn)榻涌谑请p方進(jìn)行通信的基礎(chǔ)。因此,
組件應(yīng)該遵從統(tǒng)一的標(biāo)準(zhǔn),在同一軟件中的組件必須使用同樣的接口標(biāo)準(zhǔn)才能保證組件之間可
以進(jìn)行通信。至于采用什么樣的標(biāo)準(zhǔn)則取決于系統(tǒng)設(shè)計(jì)者的選擇:如果設(shè)計(jì)軟件時,不考慮與其
他軟件的通信,則可以使用自定義的接口標(biāo)準(zhǔn);否則的話,應(yīng)該使用一些公用的標(biāo)準(zhǔn)。COM
(ComponentObjectModel,組件對象模型)就是Microsoft力推的、也是為大家一致認(rèn)可的組
件標(biāo)準(zhǔn)。
COM不僅僅提供了組件之間的接口標(biāo)準(zhǔn),它還引人了面向?qū)ο蟮乃枷?。在COM標(biāo)準(zhǔn)中,
對象是一個非?;钴S的元素,我們也經(jīng)常把它稱為COM對象。組件模塊為COM對象提供了活
動的空間,COM對象以接口的方式提供服務(wù),我們把這種接口稱為COM接口。圖1.3可說明
COM組件、COM對象和COM接口三者之間的關(guān)系。
接口1接口2接口3
圖1.3COM組件、COM對象和COM接口三者之間的關(guān)系
在windows系統(tǒng)平臺上,一個COM組件或者是一個DLL(dynamiclinkinglibrary,動態(tài)連
接庫)文件,或者是一個EXE(可執(zhí)行程序)文件。一個組件程序可以包含多個COM對象,并且
每個COM對象可以實(shí)現(xiàn)多個接口。由于大多數(shù)COM組件只包含?個COM對象,所以組件和
對象的概念很容易混淆,一定要明白二者的不同。
13.2客戶/服務(wù)器模型
COM是面向?qū)ο蟮能浖P停蚨鴮ο笫撬幕疽刂?,類似于C++中對象的概念,
對象是某個類(Class)的一個實(shí)例;而類則是一組相關(guān)的數(shù)據(jù)和功能組合在一起的一個定義。使用
對象的應(yīng)用(或另一個對象)稱為客戶,有時也稱為對象的用戶。在COM中,我們稱提供服務(wù)的
一方為服務(wù)端,被提供服務(wù)的一方為客戶端。
可以很容易看出,對象和客戶之間的相互作用是建立在客戶/服務(wù)器模型的基礎(chǔ)上的,客戶
/服務(wù)器模型的一個很大的優(yōu)點(diǎn)是穩(wěn)定性好,而穩(wěn)定性正是COM模型的目標(biāo),尤其對于跨進(jìn)程
的程序通信,穩(wěn)定性更會帶來性能上的高可靠性。
然而,COM不僅僅是一種簡單的客戶/服務(wù)器模型,有時客戶也可以反過來提供服務(wù),或
者服務(wù)方本身也需要其他對象的一些功能,在這些情況下,一個對象可能既是服務(wù)器也是客戶。
COM能夠有效地處理這些情況。
COM雖然以客戶/服務(wù)器模型為基礎(chǔ),但COM可以非常靈活地使用這種模型。圖1.4中,
每一個箭頭就代表了一個客戶/服務(wù)器關(guān)系,在圖1.4(a)中,客戶與組件對象只是一個簡單的客
戶/服務(wù)器模型結(jié)構(gòu);在圖1.4(b)中,對象2既為客戶直接提供服務(wù),也為對象1提供服務(wù),這時
對象1就成了對象2的客戶,對象1為客戶提供服務(wù),在這樣的模型中,對象1由客戶直接創(chuàng)
建,而對象2既可以由客戶創(chuàng)建,也可以由對象1創(chuàng)建;圖1.4(C)和(d)是COM中兩種重要的對
象重用結(jié)構(gòu),分別稱為包容和聚合,對于客戶來說,只知道對象1的存在,并不知道對象2的
存在,但對象1在實(shí)現(xiàn)某些服務(wù)時,它調(diào)用了對象2的服務(wù),兩者的區(qū)別在于,當(dāng)客戶調(diào)用由
對象2提供的服務(wù)時,包容模型中,由對象1調(diào)用對象2的服務(wù),再把結(jié)果轉(zhuǎn)給客戶,所以客
戶間接地調(diào)用對象2的服務(wù),而在聚合模型中,雖然客戶并不知道對象2的存在,但它調(diào)用對
象2的服務(wù)是直接進(jìn)行的。
(b)
(d)
(a)簡單客戶/服務(wù)器模型;(b)客戶/服務(wù)器模型的兩重結(jié)構(gòu)
(c)COM中包容模型示例;(d)COM中聚合模型示例
圖1.4COM使用客戶/服務(wù)器模型的幾種靈活用法
1.3.3語言無關(guān)性
COM規(guī)范的定義不依賴于特定的語言,因此,編寫組件對象所使用的語言與編寫客戶程序
使用的語言可以不同,只要它們都能夠生成符合COM規(guī)范的可執(zhí)行代碼即可。
COM標(biāo)準(zhǔn)與面向?qū)ο蟮木幊陶Z言不同,它所采用的是一種二進(jìn)制代碼級的標(biāo)準(zhǔn),而不是源
代碼級的標(biāo)準(zhǔn)。在面向?qū)ο缶幊?OOP,object-orientedprogramming)語言中定義的對象,只能在
同樣的語言中被重復(fù)使用,這就大大限制了對象的重用。當(dāng)然,OOP語言可以被用于創(chuàng)建COM
組件,因此這兩種技術(shù)實(shí)際上是互相補(bǔ)充的。COM對象把OOP語言中的對象封裝起來,并提
供一致的接口,使得它可以被各種不同的語言所使用。例如,用C++實(shí)現(xiàn)的COM組件中的對
象,可以很容易地在其他的語言如Java中被使用。因此,COM的語言無關(guān)性實(shí)際上為我們跨
語言合作開發(fā)提供了統(tǒng)一標(biāo)準(zhǔn)。
當(dāng)我們設(shè)計(jì)和開發(fā)一個應(yīng)用系統(tǒng)時,在開始編寫代碼之前,首先我們要選擇合適的語言,
語言的選擇對整個項(xiàng)目可能會產(chǎn)生很大的影響,而且,開發(fā)人員本身對語言也有喜好,讓開發(fā)
人員放棄他所熟悉的語言而去學(xué)習(xí)一門新的編程語言,不是一種很好的開發(fā)方式。只要所選擇
的語言能支持COM組件的生成,則按COM組件模型構(gòu)造的系統(tǒng)就允許使用此種編程語言。
雖然COM規(guī)范的定義與語言無關(guān),而且差不多每種語言在實(shí)現(xiàn)時都提供了對COM的支持,
如Microsoft公司的VisualC/C++、VisualBasic>VisualJ++,Borland公司的Delphi、C++Builde:
等都支持COM組件的開發(fā)和使用,而且很多語言還提供了許多可直接利用的COM組件作為產(chǎn)
品的可選配件。但與COM規(guī)范最貼近并且最能夠反映COM特性的還是C++語言。
1.3.4進(jìn)程透明特性
在客戶/服務(wù)器模型的軟件結(jié)構(gòu)中,運(yùn)行在客戶端的代碼和運(yùn)行在服務(wù)器端的代碼,既可以
在同一個進(jìn)程中,也可以在不同的進(jìn)程中。如果它們運(yùn)行在同一個進(jìn)程中,則由于組件和客戶
共享了進(jìn)程的資源,因而無論對于編程還是運(yùn)行效率都是很有益的。但實(shí)際情況往往并不這樣
簡單,因?yàn)榉?wù)程序并不總是作為DLL被裝入到客戶進(jìn)程中,它也經(jīng)常是一個EXE可執(zhí)行程
序,因此,跨進(jìn)程操作是很必要的。
COM所提供的服務(wù)組件對象在實(shí)現(xiàn)時有兩種進(jìn)程模型:進(jìn)程內(nèi)對象和進(jìn)程外對象。如果是
進(jìn)程內(nèi)對象,則它在客戶進(jìn)程空間中運(yùn)行;如果是進(jìn)程外對象,則它運(yùn)行在同一機(jī)器上的另一個
進(jìn)程空間或者在遠(yuǎn)程機(jī)器的進(jìn)程空間中。
1.3.5可重用性
可重用性是任何對象模型的實(shí)現(xiàn)目標(biāo),尤其對于大型的軟件系統(tǒng),可重用性非常重要。而
且,由于COM標(biāo)準(zhǔn)是建立在二進(jìn)制代碼級的,因此COM對象的可重用性與一般的面向?qū)ο笳Z
言如C++中對象的重用過程不同。
對于COM對象的客戶程序來說,它只是通過接口使用對象提供的服務(wù),它并不知道對象
內(nèi)部的實(shí)現(xiàn)過程,因此,組件對象的重用性可建立在組件對象的行為方式上,而不是具體的實(shí)
現(xiàn)上,這是建立重用的關(guān)鍵。
COM用兩種機(jī)制實(shí)現(xiàn)對象的重用。我們假定有兩個COM對象,對象1希望能重用對象2
的功能,我們把對象1稱為外部對象,對象2稱為內(nèi)部對象。
(1)包容方式。對象1包含了對象2,當(dāng)對象1需要用到對象2的功能時,它可以簡單地
把實(shí)現(xiàn)交給對象2來完成,雖然對象1和對象2支持同樣的接口,但對象1在實(shí)現(xiàn)接口時實(shí)際
上調(diào)用了對象2的實(shí)現(xiàn)。如圖1.4(C)所示。
(2)聚合方式。對象1只需簡單地把對象2的接口遞交給客戶即可,對象1并沒有實(shí)現(xiàn)對
象2的接口,但它把對象2的接口也暴露給客戶程序,而客戶程序并不知道內(nèi)部對象2的存在。
如圖1,4(d)所示。
對象重用是COM規(guī)范很重要的一個方面,它保證COM可用于構(gòu)造大型的軟件系統(tǒng),而且,
它使復(fù)雜的系統(tǒng)簡化為一些簡單的對象模塊,體現(xiàn)了面向?qū)ο蟮乃枷搿?/p>
1.4與COM相關(guān)的技術(shù)
1.4.1ActiveX
ActiveX是Microsoft提供的功能強(qiáng)大的程序設(shè)計(jì)和開發(fā)技術(shù)。ActiveX既是一個自動化對
象,當(dāng)然也是一個標(biāo)準(zhǔn)的COM對象,同時它也是一個界面元素,如同Windows的普通控制一
樣。ActiveX技術(shù)已經(jīng)取得了極大的成功,今天,我們可在軟件市場上買到各種各樣的ActiveX
組件,有一些軟件廠商專門致力于生產(chǎn)ActiveXoActiveX控制技術(shù)的標(biāo)準(zhǔn)化也推動了軟件的集
成化,利用已有的ActiveX組件,我們可以快速建立起功能全面的應(yīng)用系統(tǒng)。
ActiveX是一門綜合技術(shù),它涉及到COM和OLE的許多技術(shù)精華,同時也與Windows操
作系統(tǒng)緊密結(jié)合起來,它可作為Windows標(biāo)準(zhǔn)控制的一種擴(kuò)充機(jī)制。而且,ActiveX控制不僅
可用于桌面環(huán)境,它還可以用在Internet網(wǎng)絡(luò)上,作為自包含代碼的數(shù)據(jù)單元在網(wǎng)絡(luò)上傳輸,
ActiveX控制使Internet變得更加活躍。
1.4.2DCOM
DCOM是COM的擴(kuò)展,它可以支持不同計(jì)算機(jī)上組件對象與客戶程序之間或者組件對象
之間的相互通信,這些計(jì)算機(jī)可以在局域網(wǎng)內(nèi),也可以在廣域網(wǎng)上,甚至通過internet進(jìn)行連接。
對于客戶程序而言,組件程序所處的位置是透明的,我們不必編寫任何處理遠(yuǎn)程調(diào)用的代碼,
因此,DCOM也是COM的無縫擴(kuò)展。由干COM是一項(xiàng)應(yīng)用廣泛、成熟的組件技術(shù),所以我
們可以充分利用基于COM的應(yīng)用、組件、開發(fā)工具以及知識,并把它們轉(zhuǎn)移到分布式計(jì)算的
應(yīng)用領(lǐng)域中來。因?yàn)镈COM已經(jīng)為我們處理了底層網(wǎng)絡(luò)協(xié)議的所有細(xì)節(jié),所以我們可以把重點(diǎn)
放在應(yīng)用的業(yè)務(wù)邏輯上,而不必再為底層處理費(fèi)時費(fèi)力。
盡管DCOM已經(jīng)為我們考慮了底層網(wǎng)絡(luò)傳輸?shù)乃屑?xì)節(jié),也提供了相應(yīng)的實(shí)現(xiàn),但畢竟分
布式環(huán)境與桌面環(huán)境有很大的差異,客戶程序與組件程序之間的調(diào)用受更多的因素制約,如果
我們要開發(fā)出真正能夠適合于分布式環(huán)境下運(yùn)行的組件程序和客戶程序,我們?nèi)杂斜匾私?/p>
DCOM的一此基本原理.以及它處理跨機(jī)器調(diào)用所用到的一些村術(shù)。
1.4.3COM+
COM+并不是COM的新版本,我們可以把它理解為COM的新發(fā)展,或者COM更高層次
上的應(yīng)用。COM+的底層結(jié)構(gòu)仍然以COM為基礎(chǔ),它幾乎包容了COM的所有內(nèi)容。COM+不
再局限于COM的組件技術(shù),它更加注重于分布式網(wǎng)絡(luò)應(yīng)用的設(shè)計(jì)和實(shí)現(xiàn),已經(jīng)成為Microsoft
系統(tǒng)平臺策略和軟件發(fā)展策略的一部分。COM+繼承了COM幾乎全部的優(yōu)勢,同時又避免了
COM實(shí)現(xiàn)方面的一些不足。COM+緊緊地與操作系統(tǒng)結(jié)合起來,通過系統(tǒng)服務(wù)為應(yīng)用程序提供
全面的服務(wù),因?yàn)镃OM+確實(shí)綜合了這些技術(shù)要素,但它倡導(dǎo)了一種新的概念,把組件軟件提
升到應(yīng)用層而不再是底層的軟件結(jié)構(gòu),它通過操作系統(tǒng)的各種支持,使組件對象模型建立在應(yīng)
用層上,把所有組件的底層細(xì)節(jié)留給操作系統(tǒng),因此,COM+與操作系統(tǒng)的結(jié)合更加緊密。
1.5COM應(yīng)用
這幾年隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,COM更?以其巨大的潛力滲透到軟件學(xué)科的各個領(lǐng)域
中去。下面我們從以下幾個方面來看看COM的應(yīng)用。
1.5.1COM在Windows操作系統(tǒng)中的應(yīng)用
在現(xiàn)在的Windows版本中,不管是Windows95/98還是WindowsNT,很多系統(tǒng)部件以COM
的形式實(shí)現(xiàn),除了考慮與以前版本的SDK兼容之外,一些新增的組件均提供了COM接口,這
樣做的好處是,不僅使各種開發(fā)語言可宜接調(diào)用系統(tǒng)提供的功能,而且也有利于在特殊情況下
對組件的單獨(dú)升級,而這種部分升級對于MS-DOS系統(tǒng)和16位Windows系統(tǒng)是很困難的事。
在Windows操作系統(tǒng)平臺上,有一些用COM形式提供的組件模塊極大地豐富了Windows
的功能,而且也使windows功能擴(kuò)展更加靈活,例如:DirectX、ADO等。COM已經(jīng)滲透到Windows
操作系統(tǒng)的各個方面,我們要建立基于Windows平臺的應(yīng)用就離不開COM的使用,COM已
成為Windows平臺的組件模型標(biāo)準(zhǔn)。
1.5.2COM在數(shù)據(jù)庫領(lǐng)域的應(yīng)用
ODBC(opendatabasecounectivity,開放數(shù)據(jù)庫連接標(biāo)準(zhǔn))編程接口,是我們大家都很熟悉的
關(guān)于數(shù)據(jù)庫的接口,用于連接各種數(shù)據(jù)源,不同的數(shù)據(jù)源由不同的底層ODBC驅(qū)動程序驅(qū)動。
各數(shù)據(jù)庫軟件廠商都提供了ODBC驅(qū)動程序,幾乎所有的數(shù)據(jù)庫都可以通過ODBC進(jìn)行訪問。
現(xiàn)在,Microsoft又推出了用于對數(shù)據(jù)進(jìn)行一致訪問的OLEDB和ADO。OLEDB完全基于
COM,可以認(rèn)為它是ODBC的替代品,但不再局限于關(guān)系型數(shù)據(jù)庫,而是幾乎適用于所有的線
性數(shù)據(jù);ADO是建立在OLEDB上層的自動化對象庫,它可廣泛用于各種腳本語言中,這為腳
本代碼訪問數(shù)據(jù)庫提供了極大的便利。OLEDB/ADO包含數(shù)據(jù)訪問的三個層次:數(shù)據(jù)提供者(data
provider)、服務(wù)組件(serviceConlponent)、消費(fèi)者(consumer)。由于采用了開放的COM接口,增
加數(shù)據(jù)源支持將變得更加容易,數(shù)據(jù)提供者只需提供一些基本的服務(wù),在應(yīng)用層上的數(shù)據(jù)消費(fèi)
者就可以獲得各種服務(wù)組件提供的服務(wù)。
OLEDB/ADO均以COM的方式為數(shù)據(jù)訪問提供了一致的接口,已經(jīng)被應(yīng)用于Microsoft
的各種產(chǎn)品中,并且Microsoft推出的visualStudio開發(fā)工具套件也提供了OLEDB組件的開發(fā)
支持,因此,OLEDB/ADO將在今后的數(shù)據(jù)庫應(yīng)用程序的開發(fā)中起到越來越重要的作用。
1.5.3COM在企業(yè)中應(yīng)用
現(xiàn)在的企業(yè)或單位的應(yīng)用大部分都是基于企業(yè)內(nèi)部網(wǎng)絡(luò)的應(yīng)用,這些已經(jīng)不再局限于由一
個廠家提供所有的產(chǎn)品,而通常是由一些專業(yè)廠商提供其專業(yè)產(chǎn)品,然后再進(jìn)行系統(tǒng)集成。從
軟件行業(yè)的發(fā)展來看,系統(tǒng)集成所占的比重越來越大,而系統(tǒng)集成的一個關(guān)鍵的問題是軟件之
間的接口,如果所有的軟件都遵從了同樣的接口標(biāo)準(zhǔn),則不同軟件產(chǎn)品之間的交互就有了基礎(chǔ)。
顯然COM是可以擔(dān)當(dāng)起這樣的標(biāo)準(zhǔn)的,而且事實(shí)上也已經(jīng)發(fā)揮了這樣的作用。在目前較
為流行的多層軟件結(jié)構(gòu)模型中,位于中間層的業(yè)務(wù)層主要通過COM組件來實(shí)現(xiàn)。
1.5.4COM在Internet中的應(yīng)用
COM在Internet相關(guān)的軟件中的發(fā)展最能體現(xiàn)COM的優(yōu)勢,因?yàn)镮nternet軟件要求有很好
的開放性,開放性就意味著要遵從標(biāo)準(zhǔn)。在Windows平臺上,COM就是這樣的標(biāo)準(zhǔn)。Micosoft
提出的ActiveX技術(shù)包含了所有基于COM的Internet相關(guān)的軟件技術(shù)。
第二章組件技術(shù)原理
這一章我們將詳細(xì)介紹COM規(guī)范的有關(guān)基礎(chǔ)知識,尤其是COM對接口使用的約定,這部
分內(nèi)容是COM標(biāo)準(zhǔn)的核心,其他所有的高級技術(shù)都建立在此基礎(chǔ)上,因此,對這部分內(nèi)容的
學(xué)習(xí)將有助于讀者對其他技術(shù)的理解。
本章首先學(xué)習(xí)COM對象的一些基本知識,然后在學(xué)習(xí)COM接口的基礎(chǔ)上(在不會引起混
淆的情況下,我們經(jīng)常直接把COM對象簡稱為對象,把COM接口簡稱為接口)。
2.1對象與接口
在COM規(guī)范中,對象與接口是最核心的部分。COM組件提供給客戶的是以對象形式封裝
起來的實(shí)體。客戶訪問COM對象的唯一途徑是通過COM接口,因此,COM接口是COM規(guī)
范中最關(guān)鍵的內(nèi)容,在COM中接口就是一切。對于客戶來說,一個組件就是一個接口集???/p>
戶只能通過接口才能同COM組件打交道。
2.1.1COM對象
在COM規(guī)范中,并沒有對COM對象進(jìn)行嚴(yán)格的定義,但COM提供的是面向?qū)ο蟮慕M件
模型,因而對象是它的基本要素之一。類似于C++中對象的概念,對象是某個類的一個實(shí)例;
而類則是一組相關(guān)的數(shù)據(jù)和功能組合在一起的一個定義。使用對象的應(yīng)用(或另一個對象)為客
戶,有時也稱為對象的用戶。
在COM模型中,對象本身對于客戶來說是不可見的,客戶請求服務(wù)是通過接口進(jìn)行,COM
組件提供給客戶的是以對象形式封裝起來的實(shí)體。客戶程序與COM組件程序進(jìn)行交互的實(shí)體
是COM對象,它并不關(guān)心組件模塊的名稱和位置(即位置透明性),但它必須知道自己在與哪個
COM對象進(jìn)行交互。
COM對象也包括屬性(也稱為狀態(tài))和方法(也稱為操作),對象的狀態(tài)反映了對象的存在,
也是區(qū)別子其他對象的要素:COM對象提供的方法就是對象提供給外界的接口,客戶必須通過
接口才能獲得服務(wù)。對于COM對象來說,接口是它與外界進(jìn)行交互的唯一途徑,由此,封裝
特性是COM對象的基本特征。
COM對象的位置對客戶來說是透明的,因?yàn)榭蛻舨⒉恢苯尤ピL問COM對象,客戶程序通
過一個全局標(biāo)識符進(jìn)行對象的創(chuàng)建和初始化工作。在COM規(guī)范中,這個全局標(biāo)識符是一個128
位全局唯一標(biāo)識符GU1D,它基本上可以保證COM對象的唯一性。不僅COM對象采用GUID
進(jìn)行標(biāo)識,COM接口的標(biāo)識符也是GUID。
盡管COM對象也是對象,但是COM對象的概念與我們所熟悉的C++中的對象有很大差別。
我們可以從面向?qū)ο笙到y(tǒng)的兒個重要特性上對它們進(jìn)行比較:
1.封裝特性
數(shù)據(jù)封裝是兩者都具有的特性,但其形式有所不同。在COM對象中,數(shù)據(jù)是完全封裝在
對象內(nèi)部的,外部不可能直接訪問對象的數(shù)據(jù)屬性,因?yàn)镃OM對象和客戶程序可能在不同的
模塊中甚至在不同的進(jìn)程中或不同的機(jī)器上,因此,客戶直接訪問COM屬性不僅不合理,有
時也不太可能。而且,通過COM對象提供的接口成員函數(shù)訪問對象的屬性,為COM對象對屬
性的控制提供了機(jī)會,對象可以在成員函數(shù)中對新的屬性值進(jìn)行有效性判斷,若新值合理則接
受,否則便拒絕,還可以引發(fā)一些相應(yīng)的事件。
C++對象的封裝特性與COM對象的封裝有所不同,因?yàn)镃++對象的使用者與對象往往在
同一個程序模塊中(至少在同一個進(jìn)程中),所以使用者有可能直接訪問對象中的數(shù)據(jù)成員,因
此C++語言對類的成員訪問進(jìn)行控制,類的成員分別為公共數(shù)據(jù)成員(public)、私有數(shù)據(jù)成員
(private),保護(hù)數(shù)據(jù)成員(protected)。私有數(shù)據(jù)成員只能在對象內(nèi)部直接訪問,在對象外部是訪
問不到的,而公共數(shù)據(jù)成員可以在對象外部直接訪問,保護(hù)數(shù)據(jù)成員可以在其派生類的成員函
數(shù)中訪問。
對于這兩種情況的封裝特性,我們可以這樣來理解,COM對象的數(shù)據(jù)成員的封裝以組件模
塊為最終邊界,對于對象用戶是完全透明的、不可見的;而C++對象的封裝特性只是語義上的封
裝,對于對象用戶是可見的。
2.可重用性
可重用性是面向?qū)ο笙到y(tǒng)的重要特性,因此也是COM對象和C++對象的共同特性,但兩
者的表現(xiàn)形式不同,COM對象的可重用性表現(xiàn)在COM對象的包容和聚合,一個對象可以完全
使用另一個對象的所有功能;而C++對象的可重用表現(xiàn)在C++類的繼承性,派生類可以調(diào)用其父
類的非私有成員函數(shù)。
一個COM對象A如果要使用另一個COM對象B的功能,則可以通過兩種方式實(shí)現(xiàn):包容
或聚合。不管哪種形式,COM對象A都可以完全重用對象B的功能,就如同對象A自己實(shí)現(xiàn)
了對象B的功能,而且,當(dāng)對象B更新了版本或者增強(qiáng)了功能時,對象A自動使用新版本的對
象B,而根本不需要重新編譯或者重新設(shè)置,因此,COM對象的重用是動態(tài)的,可以在對象A
和對象B完全獨(dú)立的情況下,對象A重用對象B的功能。
C++對象的重用性表現(xiàn)在源代碼一級的重用性上,通過C++語言的類繼承來實(shí)現(xiàn)。從類A
派生得到的類B可以繼承類A的所有非私有成員,包括數(shù)據(jù)成員和函數(shù)成員。但類B與類A
有緊密的派生和繼承關(guān)系,當(dāng)類A的實(shí)現(xiàn)作了修改時,則類B必須重新編譯或者需要修改相應(yīng)
的代碼,然后才能適應(yīng)新的類A。而且,在最終得到的可執(zhí)行代碼中,類A和類B在同一模塊
中,重用性只體現(xiàn)在程序模塊的內(nèi)部,對模塊外部而言,重用性只體現(xiàn)在對代碼的有效管理上。
3.多態(tài)性
多態(tài)性是C++對象的重要特性,正是C++對象的多態(tài)性,才體現(xiàn)了C++語言描述事物的高
度抽象的特征。C++對象的多態(tài)性是通過其虛函數(shù)得以實(shí)現(xiàn)。
COM對象也具有多態(tài)性,但這種多態(tài)性通過COM接口實(shí)現(xiàn)。COM規(guī)范允許一個對象實(shí)
現(xiàn)多個接口,因此,COM對象的多態(tài)性可以在每個接口上得以實(shí)現(xiàn)。正是由于COM的多態(tài)性,
才可以用COM規(guī)范建立插件系統(tǒng),應(yīng)用程序可以用統(tǒng)一的方法處理每一個插件,這種插件系
統(tǒng)已經(jīng)有了很多應(yīng)用。
2.L2COM接口
在COM規(guī)范中,COM接口是最重要的部分,因?yàn)镃OM對象的客戶與對象之間通過接口
進(jìn)行交互,客戶請求服務(wù)是必須通過接口才能進(jìn)行。COM規(guī)范的核心內(nèi)容就是關(guān)于接口的定義,
雖然COM接口本身并不復(fù)雜,但圍繞COM接口有許多內(nèi)容,包括接口的標(biāo)識、接口函數(shù)的調(diào)
用習(xí)慣、參數(shù)處理、接口與對象的關(guān)系以及COM接口的特性等。
COM接口是一組邏輯上相關(guān)的函數(shù)集合,其函數(shù)也被稱為接口成員函數(shù)。按照習(xí)慣,接口
名常以“I”為前綴,例如COM的核心接口IUnknown。COM對象可以提供多個COM接口,
通過每個接口的成員函數(shù)為客戶提供各種形式的服務(wù)。和COM對象一樣,每一個COM接口都
由一個128位的全局唯一一標(biāo)識符GUID來標(biāo)識??蛻敉ㄟ^GU1D獲得接口的指針,再通過接
口指針,客戶就可以調(diào)用其相應(yīng)的成員函數(shù)。
COM接口具有如下特點(diǎn):
二進(jìn)制特性:接口規(guī)范并不建立在任何編程語言的基礎(chǔ)上,而是規(guī)定了二進(jìn)制一級
的標(biāo)準(zhǔn)。任何語言只要有足夠的數(shù)據(jù)表達(dá)能力,就可以對接口進(jìn)行描述,從而可以用于組
件程序有關(guān)的應(yīng)用開發(fā)。
接口不變性:接口是組件客戶程序和組件對象之間的橋梁,接口如果經(jīng)常發(fā)生變化,
則客戶程序和組件程序也要跟著變化,這對于應(yīng)用系統(tǒng)的開發(fā)非常不利,也不符合組
件化程序設(shè)計(jì)的思想,所以,接口應(yīng)該保持不變。
繼承性;COM接口具有不變件,但不變性并不意味著接口不再發(fā)展,隨著應(yīng)用系統(tǒng)和
組件程序曲發(fā)展,接口也需要發(fā)展。類似于C++中類的繼承性,接口也可以繼承發(fā)展,但
接口繼承于類繼承不同。首先,類繼承不僅是說明繼承,也是實(shí)現(xiàn)繼承,即派生類可以繼
承基類的函數(shù)實(shí)現(xiàn),而接口繼承只是說明繼承,即派生的接口只繼承了基接口的成員函數(shù)
說明,并沒有繼承基接口的實(shí)現(xiàn),因?yàn)榻涌诙x不包括函數(shù)實(shí)現(xiàn)部分。其次,類繼承允許
多重繼承,一個派生類可以有多個基類,但接口繼承只允許單繼承,不允許多重繼承。
多態(tài)性:多態(tài)性是面向?qū)ο笙到y(tǒng)的重要特性,COM對象也具有多態(tài)性,其多態(tài)性通過
COM接口體現(xiàn)。多態(tài)性使得客戶可以用統(tǒng)一的方法處理不同的對象,甚至是不同類型的對
象,只要它們實(shí)現(xiàn)了同樣的接口。如果幾個不同的COM對象實(shí)現(xiàn)了同一接口,則客戶程
序可以用同樣的代碼調(diào)用這些COM對象。
2.1.3全局唯一標(biāo)識符——GUID
前而已經(jīng)說過,COM組件的位置對客戶來說是透明的,因?yàn)榭蛻舨⒉恢苯尤ピL問COM組
件,但又必須知道和那個COM對象進(jìn)行交互。實(shí)際上,客戶程序通過一個全局標(biāo)識符進(jìn)行對
象的創(chuàng)建和初始化工作。
COM規(guī)范采用了128位全局唯一標(biāo)識符GUID(GloballyUniqueIdentifier),這是一種好的解
決方案。在不同任何中央授權(quán)機(jī)構(gòu)進(jìn)行協(xié)調(diào)的情況下,可以用編程的方法來生成具有唯一性的
CUIDoMicrsoftVisualC++提供了兩個建立GUID的程序,一個是UU1DGEN.EXE,該程序是
命令行方式的,另一個則是GUIDGEN.EXE,是一個示例性的VC++對話框應(yīng)用。例如在運(yùn)行
UUIDGEN.EXE時將可能會得到如下的表示GUID的串:
(ABE6D0EA-360B-46d0-ABEB-B91E95E669CE)
這是一個隨機(jī)數(shù),并不需要專門機(jī)構(gòu)進(jìn)行分配和管理。
COM對象的GUID稱為CLSlD(classidentifier,類標(biāo)識符或類ID)。每一個COM接口也使
用一個GUID來標(biāo)識,稱為IID(interfaceidentifier接口標(biāo)識符或接口ID)。
2.1.4接口定義語言IDL
在前面的講述中,我們理解了COM規(guī)范中,COM接口是最重要的部分,那么如何實(shí)現(xiàn)接
口的定義呢,我們采用接口定義語言(IDL)來實(shí)現(xiàn)它。接口描述語言提供了一種不依賴于任
何語言的接口描述方法,因此,它可以成為組件程序和客戶程序之間的共同語言。Micrsoft對
其作了擴(kuò)展,稱為MIDL語言。
實(shí)際上,用VC++做有關(guān)COM的開發(fā),VC++會為我們自動產(chǎn)生相應(yīng)的IDL文件,但我們
在這里對它先進(jìn)行一些了解。下面給出一個IDL文件的例子。
//MyATLCom.idl:IDLsourceforMyATLCom.dll
//
//ThisfilewillbeprocessedbytheMIDLtoolto
//producethetypelibrary(MyATLCom.tlb)andmarshallingcode.
import"oaidl.idr';
import"ocidl.idl";
[
object,
uuid(DlBC938C-D1BB-49C3-9824-E413865910E9),
dual,
helpstringC"!AccountInterface"),
pointer_default(unique)
1
interfacelAccount:IDispatch
{
[propget,id(1),helpstring("propertyBalance1')]HRESULTBalance([out,retval]long*pVal);
[propput,id(l),helpstring("propertyBalance")]HRESULTBalance([in]longnewVal);
[id(2),helpstringC^methodPost")]HRESULTPost([in]longIAmount,[out,retval]BSTR*pbstrResult);
I;
uuid(BF73868E-B1B2-48BB-ADB0-6ED342FCB9A2),
version(1.0),
helpstringC'MyATLCom1.0TypeLibrary1')
]
libraryMYATLCOMLib
(
importlib(,'stdole32.tlbM);
importlib("stdole2.tlb");
uuid(9E76FF85-C2FA-4B34-9E37-8F9414E70F64),
helpstring("AccountClass")
]
coclassAccount
(
[default]interfacelAccount;
);
);
在IDL中用到丁許多關(guān)鍵詞.下面給出解釋:
Import:類似于C語言中的#include,這里引入了一個頭文件oaidl.idl和另一個IDL文件
ocidl.idl;
Object:表示定義的是COM接口而不是RPC接口(遠(yuǎn)程調(diào)用接口);
uuid:uuid后面的括號括起來的是接口的IID,是接口的唯一標(biāo)識符;
interface:interface定義接口名稱;
in和。ut:指定參數(shù)的方向?!癷n”表示輸入?yún)?shù),“out”表示輸出參數(shù);
pointer_default:為除參數(shù)列表中的指另外的所有指針指定缺省類型:
max.is:指定數(shù)組的最大元素個數(shù);
sizejs:也用于指定數(shù)組或指針的元素?cái)?shù)目。
在編寫好[DC文件之后,可以使用VC++提供的MIDL工具,把IDL接口描述文件編譯成
可被組件程序和客戶程序所使用的C源代碼文件。MIDL在VC安裝之后的VC\B1N目錄下。
例如用下面的命令編譯myatlcom.idl:
Midimyatlcom.idl
則產(chǎn)生下面的文件:
Myatlcom.h——包含接口說明的頭文件,可用于C或者C++語言;
Myatlcom_p.c該C文件實(shí)現(xiàn)了接口的代理和存根:
Myatlcom_i.c——該C文件定義了IDL文件中用到的所有全局標(biāo)識待GUID,以及接口
的11D;
dlldata.c——該C文件包含代理及存根的DLL程序的入口函數(shù)以及代理類廠所需要的數(shù)據(jù)
結(jié)構(gòu)。
Myatlcom.tlb該文件為類型庫。
2.2組件應(yīng)用模型
前面一節(jié)介紹了COM的最基本的概念,這一節(jié)我們將從COM的整體應(yīng)用模型來認(rèn)識
COM=COM應(yīng)用是基于客戶/服務(wù)器模型,COM組件向COM客戶提供服務(wù),并根據(jù)COM
對象與COM客戶的位置關(guān)系將組件分為進(jìn)程內(nèi)組件和進(jìn)程外組件。在COM客戶與COM對象
的通信過程中COM庫起著于關(guān)重要的橋梁作用。當(dāng)客戶要創(chuàng)建COM對象時,由COM庫從系
統(tǒng)注冊表中找到對象創(chuàng)建的必要信息,所以注冊表在COM應(yīng)用中起著很重要的作用。本節(jié)將
詳細(xì)介紹這些內(nèi)容。
2.2.1客戶/服務(wù)器模型
COM對象和客戶之間的相互作用是建立在客戶/服務(wù)器模型的基礎(chǔ)之上的。COM服務(wù)器實(shí)
際上是COM組件對象的容器,由COM服務(wù)器內(nèi)的組件對象向COM客戶提供服務(wù)。所以,COM
應(yīng)用模型可以繼承客戶/服務(wù)器模型的許多優(yōu)勢,比如:高穩(wěn)定性和可靠性、很強(qiáng)的擴(kuò)展性、性
能得到提高以及數(shù)據(jù)庫的事務(wù)機(jī)制等。COM還可以非常靈活地使用客戶/服務(wù)器模型,實(shí)現(xiàn)COM
對象的重用機(jī)制。(有關(guān)COM的客戶/服務(wù)器模型的內(nèi)容可以參看1.3.2節(jié)內(nèi)容)
COM客戶和COM服務(wù)器在建立通信連接之前是沒有任何聯(lián)系的,COM客戶并不知道
COM服務(wù)器位于什么地方,甚至連有沒有這樣的服務(wù)器都不知道。當(dāng)客戶請求某個對象的服務(wù)
時客戶只需傳遞該對象類的標(biāo)識符(CLSID),由COM庫負(fù)責(zé)找到組件的位置并返回接口指針給
客戶,然后客戶就可以使用接口指針獲得對象的服務(wù)。
根據(jù)COM客戶和COM服務(wù)器是否運(yùn)行在向一進(jìn)程地址空間,COM服務(wù)器可以分為進(jìn)程
內(nèi)COM服務(wù)器或進(jìn)程內(nèi)組件,和進(jìn)程外COM服務(wù)器或進(jìn)程外組件。然后根據(jù)組件是否和客戶
位于同一臺計(jì)算機(jī),進(jìn)程外組件又可以分為本地組件和遠(yuǎn)程組件:
■進(jìn)程內(nèi)組件:組件程序被加載到客戶的進(jìn)程地址空間,在Windows環(huán)境下,進(jìn)程內(nèi)組
件程序通常以動態(tài)鏈接庫(DLL)的形式實(shí)現(xiàn);
■本地組件:組件程序和客戶程序運(yùn)行在同一臺機(jī)器上,但組件程序是一個獨(dú)立的應(yīng)
用程序,通常是一個EXE文件;
■遠(yuǎn)程組件:組件程序運(yùn)行在與客戶不同的機(jī)器上,它既可以是一個DLL模塊,也可以
是一個EXE文件。
雖然COM組件對象有不問的進(jìn)程模型,但這種區(qū)別對十客戶程序來說是透明的,客戶程
序在使用組件對象時可以不管這種區(qū)別的存在。只要遵照COM規(guī)范即可。這種進(jìn)程透明件的
關(guān)鍵在于COM庫,COM庫會負(fù)責(zé)組件程序的定位,并管理組件對象的創(chuàng)建和對象與客戶之間
的通信。
當(dāng)客戶創(chuàng)建組件對象時,COM庫負(fù)責(zé)裝入組件模塊或者啟動組件進(jìn)程,如果客戶指定的組
件對象程序位于遠(yuǎn)程機(jī)器上,則兩臺機(jī)器上的COM庫會協(xié)同完成遠(yuǎn)程COM對象的創(chuàng)建工作,
并且在客戶進(jìn)程個創(chuàng)建一個代理對象(proxyobject),客戶程序直接與代理對象進(jìn)行交互。
雖然對于客戶程序而言,三種進(jìn)程類型是透明的,用戶程序可以不必管要創(chuàng)建的是哪種類
型的組件。但是在實(shí)現(xiàn)COM組件時,還是應(yīng)該慎重選擇進(jìn)程模型:
進(jìn)程內(nèi)模型的優(yōu)點(diǎn)是效率高,但組件不穩(wěn)定會引起客戶進(jìn)程崩潰,因此組件可能會危及客
戶;進(jìn)程外模型的優(yōu)點(diǎn)是穩(wěn)定性好,組件進(jìn)程不會危及客戶程序,一個組件進(jìn)程可以為多個客
戶進(jìn)程服務(wù),但進(jìn)程外組件開銷大,而且調(diào)用效率相對低一些。
2.2.2COM庫
從COM應(yīng)用模型中可以發(fā)現(xiàn)了COM庫在整個COM對象體系中起了很重要的作用,COM
庫充當(dāng)著組件程序和客戶程序之間的橋梁,尤其是在組件對象的創(chuàng)建過程中,以及在對象管理、
內(nèi)存管理和一些標(biāo)準(zhǔn)化操作等方面起著重要的作用,這一節(jié)將分別介紹COM庫在這些方面的
實(shí)現(xiàn)方法。
為了使函數(shù)調(diào)用有效,在進(jìn)行函數(shù)調(diào)用之前,首先必須調(diào)用COM庫的初始化函數(shù)對COM
庫進(jìn)行初始化,COM庫的初姑化函數(shù)為:
HRESULTCoInitialize(IMalloc*pMalloc);
參數(shù)pMalloc用于指定一個內(nèi)存分配器,它是一個IMalloc指針接口,一般情況下,我們直
接把參數(shù)設(shè)為NULL,則COM庫將使用缺省提供的內(nèi)存分配器。
函數(shù)的返回值有三種可能:
S_OK:表示初始化成功;
S_FALSE:表示初始化雖然成功,但這次調(diào)用不是本進(jìn)程中首次調(diào)用初始化函數(shù):
S_UNEXPECTED:表示初始化錯誤,應(yīng)用秘序不能使用COM庫。
通常,一個進(jìn)程對COM庫只進(jìn)行一次初始化,而且,在同一個模塊單元中對COM庫進(jìn)行
多次初始化并沒有意義。COM庫要求客戶在調(diào)用其函數(shù)之前,必須先調(diào)用初始化函數(shù)成功以后
才能進(jìn)行。
應(yīng)用程序?qū)OM庫進(jìn)行初始化之后,就可以調(diào)用COM庫所提供的各種服務(wù),在調(diào)用過程
中必然要消耗由COM庫管理的資源,尤其是一些影響系統(tǒng)全局的資源,因此,COM程序在用
完COM庫服務(wù)之后,通常是在程序退出之前,一定要調(diào)用終止COM庫服務(wù)函數(shù),以便釋放
COM庫所維護(hù)的資源。COM庫的終止函數(shù)為:
VoidCoUninitialize(void);
下表列出了COM庫中常用的函數(shù):
類別函數(shù)功能
CoBuiMVcrBion獲取COM岸的版本號
CoUnitialize8M庠的初始化
初始化函數(shù)
CoUninitkdize8M庫功能股務(wù)終止
CoFrveUnusedlibrahes降放進(jìn)程中所有不再使用的組件程序
UEqualGUlD河斷兩個GUID是否相等
kEqualllD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代物流信息系統(tǒng)建設(shè)中的標(biāo)準(zhǔn)化問題
- 生態(tài)文明教育在校園的實(shí)踐與推廣
- 現(xiàn)代企業(yè)綜合管理能力提升及領(lǐng)導(dǎo)力培訓(xùn)方案研究報告
- 2023三年級語文上冊 第一單元 習(xí)作:猜猜他是誰說課稿 新人教版
- Unit 2 AnimaIs Lesson 1 Enjoy the story(說課稿)-2024-2025學(xué)年北師大版(三起)英語五年級上冊
- 2024秋八年級物理上冊 第1章 機(jī)械運(yùn)動 第2節(jié) 運(yùn)動的描述說課稿2(新版)新人教版
- 2025仿石漆施工合同
- 13蚯蚓的家 說課稿-2023-2024學(xué)年科學(xué)一年級下冊青島版
- 2025農(nóng)副產(chǎn)品購銷結(jié)合合同樣本
- 2024-2025學(xué)年新教材高中英語 Unit 5 On the road預(yù)習(xí) 新知早知道1說課稿 外研版必修第二冊
- 口腔種植術(shù)單病種質(zhì)控查檢表
- 中日勞務(wù)合同范本
- 白宮-人工智能行業(yè):美國人工智能權(quán)利法案藍(lán)圖(英譯中)
- 營口市大學(xué)生??紝U锌荚囌骖}2022
- 典范英語8-15Here comes trouble原文翻譯
- 六安市葉集化工園區(qū)污水處理廠及配套管網(wǎng)一期工程環(huán)境影響報告書
- 運(yùn)動技能學(xué)習(xí)與控制課件第一章運(yùn)動技能學(xué)習(xí)與控制概述
- 固體廢棄物檢查記錄
- 工程設(shè)計(jì)費(fèi)取費(fèi)標(biāo)準(zhǔn)
- 2023年遼寧鐵道職業(yè)技術(shù)學(xué)院高職單招(數(shù)學(xué))試題庫含答案解析
- CAPP教學(xué)講解課件
評論
0/150
提交評論