地理信息系統(tǒng)技術(shù)基礎(chǔ)_第1頁
地理信息系統(tǒng)技術(shù)基礎(chǔ)_第2頁
地理信息系統(tǒng)技術(shù)基礎(chǔ)_第3頁
地理信息系統(tǒng)技術(shù)基礎(chǔ)_第4頁
地理信息系統(tǒng)技術(shù)基礎(chǔ)_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論