地理信息系統技術基礎_第1頁
地理信息系統技術基礎_第2頁
地理信息系統技術基礎_第3頁
地理信息系統技術基礎_第4頁
地理信息系統技術基礎_第5頁
已閱讀5頁,還剩100頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

GIS技術

第一部分:組件技術

1.概述

組件的起源

組件的發展

組件技術現狀

2.組件技術原理

組件基礎知識

基本概念

對象與接口

組件應用模型

組件復用技術

組件技術的應用

基于組件的應用技術

多層軟件結構

高級組件技術(com+dcommts)

3.組件開發

4.組件的使用

5.組件技術與GIS

6.MapObject

第二部分:網絡技術

1.計算機網絡技術

2.分布式GIS

3.WEBGIS

WEBGIS基本概念

WEBGIS主要特點

主要webGIS系統平臺介紹

WEBGIS原理及相關技術

第三部分:空間數據庫技術

1.空間數據庫簡介

2.空間概念和數據模型

3.空間查詢與空間索引

4.基于WEB的空間數據庫系統

5.空間數據挖掘簡介

6.空間數據庫發展趨勢

第四部分:地形三維可視技術

1.概述

2.地形三維顯示的基本過程

地形三維顯示中的數據準備

地形表面擬合

投影變換

消隱與裁剪

紋理映射

光照模型

3.OpenGL

目錄

目錄3

第一篇:組件對象模型(COM)7

第一章:COM概述8

1.1COM的起源8

1.1.1COM的發展簡史8

1.1.2組件的產生9

1.2使用組件的優點1()

1.3COM特性10

1.3.1面向對象的組件模型一COM11

132客戶/服務器模型11

1.3.3語言無關性12

1.3.4進程透明特性13

1.3.5可重用性13

1.4與COM相關的技術14

1.4.1ActiveX14

1.4.2DCOM14

1.4.3COM+14

1.5COM應用15

1.5.1COM在Windows操作系統中的應用15

1.5.2COM在數據庫領域的應用15

1.5.3COM在企業中應用15

1.5.4COM在Internet中的應用16

第二章組件技術原理17

2.1對象與接口17

2.1.1COM對象17

2.1.2COM接口18

2.1.3全局唯一標識符——GUID19

2.1.4接口定義語言IDL19

2.2組件應用模型21

2.2.1客戶/服務器模型21

2.2.2COM庫22

2.2.3通過注冊表管理COM對象23

2.2.4COM客戶對組件的調用25

2.3組件復用技術26

2.3.1組件的聚合26

2.3.2組件的包容26

第三章用VC++開發COM組件27

3.1基于MFC開發COM組件27

3.1.1MFC開發COM組件概述27

3.1.2用MFC開發COM組件例程28

3.2基于ATL開發COM組件31

3.2.1ATL開發COM組件概述31

3.2.2用ATL開發COM組件例程32

第四章VC++中使用代碼組件36

4.1.相關基礎知識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

第五章組件技術與GIS43

5.1組件式GIS系統的特點44

5.2組件式GIS的結構45

5.2.1組件式GIS的體系結構45

5.2.2組件層次劃分47

5.2.3組件功能劃分48

5.4GIS組件產品及比較53

第六章MapObject53

第二篇:空間數據庫訪問技術54

第一章空間數據庫簡介55

1.1空間數據庫55

1.1.1空間數據庫與地理信息系統55

1.1.2空間數據庫的發展56

1.2基于關系數據庫的空間數據庫管理系統57

1.2.1采用關系數據庫的優點57

1.2.2基于關系數據庫的GIS模型58

第二章空間數據庫訪問59

2.1采用ADO訪問空間數據庫59

2.1.1ADO對象模型59

2.1.2在VisualC++中使用ADO61

2.1.3在VisualC++中使用ADO(例程)67

2.2采用ODBC接口實現多數據庫支持72

2.2.1ODBC基本概念:72

2.2.2ODBC組成:72

2.2.3ODBC在GIS中的意義73

2.2.4設置ODBC數據源74

第三篇WebGIS77

第一章GIS與Internet.WorldWideWeb78

1.1Internet——巨大的信息庫78

1.2WWW——Internet成功的關鍵因素79

1.3Intranet日益興起79

1.4Internet、WWW對GIS的影響80

第二章WebGIS概述8()

2.1WebGIS的概念80

2.2WebGIS與傳統GIS的比較81

2.3WebGIS的體系結構82

2.4WebGIS的基本工作模式和分類83

第三章WebGIS中的WWW技術85

3.1WebGIS瀏覽器85

3.2.客戶端與服務端通訊方式和接口設計86

3.2.1通用網關接口(CGI)/服務器應用程序接口方法(SAPI)86

3.2.2插入法(Plug-in)88

3.2.3JavaApplet/ActiveX89

3.2.4綜合性的技術方法90

第四章WebGIS實現92

4.1MapXtreme簡介92

4.1.1MapXtreme引擎92

4.1.2MapXtreme構成93

4.1.3MapXtreme月艮務器酉己置93

4.1.4MapXtreme應用程序的工作流程97

4.1.5MpXtreme數據98

4.2MapXtreme系統開發構架99

4.2.1開發構架基本概述99

4.2.2初始化地圖服務器100

4.2.3客戶端向地圖服務器提交請求102

4.2.4地圖服務器處理客戶請求104

4.2.5將處理結果輸出給客戶端105

4.2.6釋放地圖服務資源105

第一篇:組件對象模型(COM)

第一章:COM概述

組件式是當前軟件技術發展的潮流之一。它的優點是具有高度的重用性和互用性,涉及到

應用程序構成的各個方面,對應用程序的開發產生很大的影響。目前主要是基于Mircrosoft的

COM/DCOM規范業己成為業界的事實上的標準。本書中我們主要介紹Mircrosoft的COM組件

模型。

COM,即組件對象模型(ComponentObjectModel),是關于如何建立組件以及如何通過組

件架構應用程序的一個規范,是Mircrosoft創建的一種二進制和網絡標準,它允許任意兩個組

件之間互相通信,而不管它們是在什么計算機上運行(只要計算機是相連的),不管各計算機運

行的是什么操作系統(只要該操作系統支持COM),也不管該組件是用什么語言寫的。

1.1COM的起源

軟件工業的迅速發展,使得軟件的規模越做越大,功能越來越強,版本的更新也越來越快。

這種變化對于傳統的軟件開發方式提出了新的挑戰:

對于用戶而言:

為了使用軟件的少數幾項功能,而不得不購買整個鐵板一塊的應用程序,不同的軟件的功

能大量重疊,造成資源的大量浪費。

對于軟件開發商而言:

首先,軟件規模的不斷增大,使得開發團隊也越來越大,團隊的協調工作變得極其復雜,

應用難以被集成;

其次,頻繁的軟件升級和改版使得軟件開發陷入不可維護的境地,傳統的軟件開發方式及

技術已經越來越不能適應軟件發展的需要。

因此,軟件行業迫切需要一種解決上述問題的新的方法和技術手段。COM技術正是在這種

情況下出現的。

1.1.1COM的發展簡史

任何一種技術從產生到成熟都有一個長期的發展歷程,作為組件化軟件模型,COM的發展

過程也不例外。本節對Mircrosoft的組件技術的發展過程進行回顧。隨著桌面窗口系統中應用

程序之間的交互不斷深入,就在OLE技術的發展過程中產生了COM。

從字面上來看,OLE所表達的是復合文檔(compounddocument)的概念,而且,OLE的第一

個版本即OLEI也僅限于此。需要指出的是,在OLEI中,組件程序和客戶程序之間進行通信

并沒有使用COM規范,而是使用了一種被稱為動態數據交換(DDE,dynamicDataExchange)的

機制,DDE建立在Windows操作系統的消息機制基礎上,其最大的缺點是效率低,而且穩定性

不好,使用也不夠方便。

DDE的這些缺陷也限制了OLE1的發展,于是,在第二個OLE版本即OLE2中,Microsoft

重新編寫了底層代碼,放棄了DDE,采用了新的COM模型,因此,OLE2成了第一個用COM

架構的軟件系統。由于采用了COM,OLE2比OLE1效率更高,穩定性和靈活性有了很大提

高。

在以后OLE的發展過程中,由于采用了COM作為其底層結構,使用COM接口(interface)

作為程序之間通信的標準,因此,OLE模塊定制和擴充變得非常方便。這里我順便提一下軟件

版本的升級方式。一般的應用系統在升級版本時,往往用新的軟件模塊全部替換老的程序模塊,

因此,升級就意味著全部更新,例如OLE2對OLE1進行升級,不僅軟件模塊作了替換,連基

本技術也變了。但是在OLE2之后,由于采用了組件化的軟件模型,因此,每一個底層模塊可

以單獨升級,而且在原來軟件模塊的基礎上,可以添加新的組件模塊而不需要改變原有的組件

模塊。因此,在OLE2之后,OLE技術不再局限于“對象鏈接和嵌入”,不再局限于復合文檔,

而變成了在桌面系統上進行程序通信的一個技術統稱。因此,當人們正在等待“OLE3”出現的

時候,OLE己經不再是最初的OLE了。并且,用戶計算機中的OLE系統也正悄悄地在進行更

新。

1.1.2組件的產生

在計算機軟件發展的早期,一個應用程序通常是由單個的二進制文件組成的。應用越復雜,

程序就越龐大,系統開發的難度也就越大。而且,當編譯器生成此應用程序之后,在對下一版

本重新編譯并發行新生成的版本之前,應用程序一般不會發生任何變化。操作系統、硬件及客

戶需求的改變都必須等到整個應用程序被重新編譯之后才能夠得以認可。而對于龐大的程序來

講,更新版本的周期很長,在兩個版本之間,如果由于操作系統發生了變化,或者硬件平臺有

了變化,則應用系統就很難適應這樣的變化。所以這類單體應用程序已經不能滿足計算機軟硬

件的發展需要。

目前這種狀況已經發生了變化。人們認識到應用程序在發行之后不應該保持那種靜止的狀

態。從軟件模型角度來考慮,一個很自然的想法就是把一個龐大的應用程序分成多個模塊,每

一個模塊保持一定的功能獨立性,在協同工作時,通過相互之間的接口完成實際的任務。我們

把每一個這樣的模塊稱為組件(圖1

單個應用程序組件應用程序

圖I」傳統的應用程序與組件應用程序對比

一個設計良好的應用系統往往被切分成一些組件,這些組件可以單獨開發,單獨編譯,甚

至單獨調試和測試。當所有的組件開發完成后,把它們組合在一起就得到了完整的應用系統。

當系統的外界軟硬件環境發生變化或者用戶的需求有所更改時,并不需要對所有的組件進行修

改,而只需對受影響的組件進行修改,然后重新組合得到新的升級軟件。圖1.2體現了這樣的

一個升級過程。

組件應用程序

圖1.2組件應用程序的升級

1.2使用組件的優點

>應用程序靈活、自由定制

用戶通常希望能夠按自己的需求和意愿來定制他們所用的應用程序(如在Arcinfo中我們只

選用我們需要的模塊),以使應用程序能夠按他們自己的需求和習慣那樣工作。

>應用程序程序開發容易、快捷

采用組件架構最引人注目的優點之一是快速應用程序開發。這一優點可以使開發人員從某

個組件庫中取出所需的組件并將其快速地組裝到一塊以構造所需的應用程序,如同搭積木塊一

樣。

>網絡透明性

組件的易替換性和客戶機/服務器的特點使得在將已有應用程序轉化成分布式應用程序時,

若己有應用程序是由組件組裝成的,那么轉化過程將會簡單得多。本地機器的應用程序并不需

要知道實際所用到的組件到底在何處。類似地,遠地組件也不需要知道它們是否位于遠地。這

樣通過加人合適的遠地組件,應用程序完全不需要知道實際的組件到底在那里。

1.3COM特性

COM規范所定義的組件模型,主要有五個特性:面向對象的特性、客戶/服務器特性、語

言無關性、對進程的透明性和它的可重用機制。

1.3.1面向對象的組件模型一COM

在上面論述中,我們主要講述了將應用程序分解成組件的思想,忽略了組件與組件之間是

如何組合成一個功能完備的符合要求的應用程序的方法。實際上,組件與組件之間的組合是通

過組件的接口,組件之間的接口是組件軟件的關鍵,因為接口是雙方進行通信的基礎。因此,

組件應該遵從統一的標準,在同一軟件中的組件必須使用同樣的接口標準才能保證組件之間可

以進行通信。至于采用什么樣的標準則取決于系統設計者的選擇:如果設計軟件時,不考慮與其

他軟件的通信,則可以使用自定義的接口標準;否則的話,應該使用一些公用的標準。COM

(ComponentObjectModel,組件對象模型)就是Microsoft力推的、也是為大家一致認可的組

件標準。

COM不僅僅提供了組件之間的接口標準,它還引人了面向對象的思想。在COM標準中,

對象是一個非常活躍的元素,我們也經常把它稱為COM對象。組件模塊為COM對象提供了活

動的空間,COM對象以接口的方式提供服務,我們把這種接口稱為COM接口。圖1.3可說明

COM組件、COM對象和COM接口三者之間的關系。

接口1接口2接口3

圖1.3COM組件、COM對象和COM接口三者之間的關系

在windows系統平臺上,一個COM組件或者是一個DLL(dynamiclinkinglibrary,動態連

接庫)文件,或者是一個EXE(可執行程序)文件。一個組件程序可以包含多個COM對象,并且

每個COM對象可以實現多個接口。由于大多數COM組件只包含?個COM對象,所以組件和

對象的概念很容易混淆,一定要明白二者的不同。

13.2客戶/服務器模型

COM是面向對象的軟件模型,因而對象是它的基本要素之一,類似于C++中對象的概念,

對象是某個類(Class)的一個實例;而類則是一組相關的數據和功能組合在一起的一個定義。使用

對象的應用(或另一個對象)稱為客戶,有時也稱為對象的用戶。在COM中,我們稱提供服務的

一方為服務端,被提供服務的一方為客戶端。

可以很容易看出,對象和客戶之間的相互作用是建立在客戶/服務器模型的基礎上的,客戶

/服務器模型的一個很大的優點是穩定性好,而穩定性正是COM模型的目標,尤其對于跨進程

的程序通信,穩定性更會帶來性能上的高可靠性。

然而,COM不僅僅是一種簡單的客戶/服務器模型,有時客戶也可以反過來提供服務,或

者服務方本身也需要其他對象的一些功能,在這些情況下,一個對象可能既是服務器也是客戶。

COM能夠有效地處理這些情況。

COM雖然以客戶/服務器模型為基礎,但COM可以非常靈活地使用這種模型。圖1.4中,

每一個箭頭就代表了一個客戶/服務器關系,在圖1.4(a)中,客戶與組件對象只是一個簡單的客

戶/服務器模型結構;在圖1.4(b)中,對象2既為客戶直接提供服務,也為對象1提供服務,這時

對象1就成了對象2的客戶,對象1為客戶提供服務,在這樣的模型中,對象1由客戶直接創

建,而對象2既可以由客戶創建,也可以由對象1創建;圖1.4(C)和(d)是COM中兩種重要的對

象重用結構,分別稱為包容和聚合,對于客戶來說,只知道對象1的存在,并不知道對象2的

存在,但對象1在實現某些服務時,它調用了對象2的服務,兩者的區別在于,當客戶調用由

對象2提供的服務時,包容模型中,由對象1調用對象2的服務,再把結果轉給客戶,所以客

戶間接地調用對象2的服務,而在聚合模型中,雖然客戶并不知道對象2的存在,但它調用對

象2的服務是直接進行的。

(b)

(d)

(a)簡單客戶/服務器模型;(b)客戶/服務器模型的兩重結構

(c)COM中包容模型示例;(d)COM中聚合模型示例

圖1.4COM使用客戶/服務器模型的幾種靈活用法

1.3.3語言無關性

COM規范的定義不依賴于特定的語言,因此,編寫組件對象所使用的語言與編寫客戶程序

使用的語言可以不同,只要它們都能夠生成符合COM規范的可執行代碼即可。

COM標準與面向對象的編程語言不同,它所采用的是一種二進制代碼級的標準,而不是源

代碼級的標準。在面向對象編程(OOP,object-orientedprogramming)語言中定義的對象,只能在

同樣的語言中被重復使用,這就大大限制了對象的重用。當然,OOP語言可以被用于創建COM

組件,因此這兩種技術實際上是互相補充的。COM對象把OOP語言中的對象封裝起來,并提

供一致的接口,使得它可以被各種不同的語言所使用。例如,用C++實現的COM組件中的對

象,可以很容易地在其他的語言如Java中被使用。因此,COM的語言無關性實際上為我們跨

語言合作開發提供了統一標準。

當我們設計和開發一個應用系統時,在開始編寫代碼之前,首先我們要選擇合適的語言,

語言的選擇對整個項目可能會產生很大的影響,而且,開發人員本身對語言也有喜好,讓開發

人員放棄他所熟悉的語言而去學習一門新的編程語言,不是一種很好的開發方式。只要所選擇

的語言能支持COM組件的生成,則按COM組件模型構造的系統就允許使用此種編程語言。

雖然COM規范的定義與語言無關,而且差不多每種語言在實現時都提供了對COM的支持,

如Microsoft公司的VisualC/C++、VisualBasic>VisualJ++,Borland公司的Delphi、C++Builde:

等都支持COM組件的開發和使用,而且很多語言還提供了許多可直接利用的COM組件作為產

品的可選配件。但與COM規范最貼近并且最能夠反映COM特性的還是C++語言。

1.3.4進程透明特性

在客戶/服務器模型的軟件結構中,運行在客戶端的代碼和運行在服務器端的代碼,既可以

在同一個進程中,也可以在不同的進程中。如果它們運行在同一個進程中,則由于組件和客戶

共享了進程的資源,因而無論對于編程還是運行效率都是很有益的。但實際情況往往并不這樣

簡單,因為服務程序并不總是作為DLL被裝入到客戶進程中,它也經常是一個EXE可執行程

序,因此,跨進程操作是很必要的。

COM所提供的服務組件對象在實現時有兩種進程模型:進程內對象和進程外對象。如果是

進程內對象,則它在客戶進程空間中運行;如果是進程外對象,則它運行在同一機器上的另一個

進程空間或者在遠程機器的進程空間中。

1.3.5可重用性

可重用性是任何對象模型的實現目標,尤其對于大型的軟件系統,可重用性非常重要。而

且,由于COM標準是建立在二進制代碼級的,因此COM對象的可重用性與一般的面向對象語

言如C++中對象的重用過程不同。

對于COM對象的客戶程序來說,它只是通過接口使用對象提供的服務,它并不知道對象

內部的實現過程,因此,組件對象的重用性可建立在組件對象的行為方式上,而不是具體的實

現上,這是建立重用的關鍵。

COM用兩種機制實現對象的重用。我們假定有兩個COM對象,對象1希望能重用對象2

的功能,我們把對象1稱為外部對象,對象2稱為內部對象。

(1)包容方式。對象1包含了對象2,當對象1需要用到對象2的功能時,它可以簡單地

把實現交給對象2來完成,雖然對象1和對象2支持同樣的接口,但對象1在實現接口時實際

上調用了對象2的實現。如圖1.4(C)所示。

(2)聚合方式。對象1只需簡單地把對象2的接口遞交給客戶即可,對象1并沒有實現對

象2的接口,但它把對象2的接口也暴露給客戶程序,而客戶程序并不知道內部對象2的存在。

如圖1,4(d)所示。

對象重用是COM規范很重要的一個方面,它保證COM可用于構造大型的軟件系統,而且,

它使復雜的系統簡化為一些簡單的對象模塊,體現了面向對象的思想。

1.4與COM相關的技術

1.4.1ActiveX

ActiveX是Microsoft提供的功能強大的程序設計和開發技術。ActiveX既是一個自動化對

象,當然也是一個標準的COM對象,同時它也是一個界面元素,如同Windows的普通控制一

樣。ActiveX技術已經取得了極大的成功,今天,我們可在軟件市場上買到各種各樣的ActiveX

組件,有一些軟件廠商專門致力于生產ActiveXoActiveX控制技術的標準化也推動了軟件的集

成化,利用已有的ActiveX組件,我們可以快速建立起功能全面的應用系統。

ActiveX是一門綜合技術,它涉及到COM和OLE的許多技術精華,同時也與Windows操

作系統緊密結合起來,它可作為Windows標準控制的一種擴充機制。而且,ActiveX控制不僅

可用于桌面環境,它還可以用在Internet網絡上,作為自包含代碼的數據單元在網絡上傳輸,

ActiveX控制使Internet變得更加活躍。

1.4.2DCOM

DCOM是COM的擴展,它可以支持不同計算機上組件對象與客戶程序之間或者組件對象

之間的相互通信,這些計算機可以在局域網內,也可以在廣域網上,甚至通過internet進行連接。

對于客戶程序而言,組件程序所處的位置是透明的,我們不必編寫任何處理遠程調用的代碼,

因此,DCOM也是COM的無縫擴展。由干COM是一項應用廣泛、成熟的組件技術,所以我

們可以充分利用基于COM的應用、組件、開發工具以及知識,并把它們轉移到分布式計算的

應用領域中來。因為DCOM已經為我們處理了底層網絡協議的所有細節,所以我們可以把重點

放在應用的業務邏輯上,而不必再為底層處理費時費力。

盡管DCOM已經為我們考慮了底層網絡傳輸的所有細節,也提供了相應的實現,但畢竟分

布式環境與桌面環境有很大的差異,客戶程序與組件程序之間的調用受更多的因素制約,如果

我們要開發出真正能夠適合于分布式環境下運行的組件程序和客戶程序,我們仍有必要了解

DCOM的一此基本原理.以及它處理跨機器調用所用到的一些村術。

1.4.3COM+

COM+并不是COM的新版本,我們可以把它理解為COM的新發展,或者COM更高層次

上的應用。COM+的底層結構仍然以COM為基礎,它幾乎包容了COM的所有內容。COM+不

再局限于COM的組件技術,它更加注重于分布式網絡應用的設計和實現,已經成為Microsoft

系統平臺策略和軟件發展策略的一部分。COM+繼承了COM幾乎全部的優勢,同時又避免了

COM實現方面的一些不足。COM+緊緊地與操作系統結合起來,通過系統服務為應用程序提供

全面的服務,因為COM+確實綜合了這些技術要素,但它倡導了一種新的概念,把組件軟件提

升到應用層而不再是底層的軟件結構,它通過操作系統的各種支持,使組件對象模型建立在應

用層上,把所有組件的底層細節留給操作系統,因此,COM+與操作系統的結合更加緊密。

1.5COM應用

這幾年隨著計算機技術的飛速發展,COM更?以其巨大的潛力滲透到軟件學科的各個領域

中去。下面我們從以下幾個方面來看看COM的應用。

1.5.1COM在Windows操作系統中的應用

在現在的Windows版本中,不管是Windows95/98還是WindowsNT,很多系統部件以COM

的形式實現,除了考慮與以前版本的SDK兼容之外,一些新增的組件均提供了COM接口,這

樣做的好處是,不僅使各種開發語言可宜接調用系統提供的功能,而且也有利于在特殊情況下

對組件的單獨升級,而這種部分升級對于MS-DOS系統和16位Windows系統是很困難的事。

在Windows操作系統平臺上,有一些用COM形式提供的組件模塊極大地豐富了Windows

的功能,而且也使windows功能擴展更加靈活,例如:DirectX、ADO等。COM已經滲透到Windows

操作系統的各個方面,我們要建立基于Windows平臺的應用就離不開COM的使用,COM已

成為Windows平臺的組件模型標準。

1.5.2COM在數據庫領域的應用

ODBC(opendatabasecounectivity,開放數據庫連接標準)編程接口,是我們大家都很熟悉的

關于數據庫的接口,用于連接各種數據源,不同的數據源由不同的底層ODBC驅動程序驅動。

各數據庫軟件廠商都提供了ODBC驅動程序,幾乎所有的數據庫都可以通過ODBC進行訪問。

現在,Microsoft又推出了用于對數據進行一致訪問的OLEDB和ADO。OLEDB完全基于

COM,可以認為它是ODBC的替代品,但不再局限于關系型數據庫,而是幾乎適用于所有的線

性數據;ADO是建立在OLEDB上層的自動化對象庫,它可廣泛用于各種腳本語言中,這為腳

本代碼訪問數據庫提供了極大的便利。OLEDB/ADO包含數據訪問的三個層次:數據提供者(data

provider)、服務組件(serviceConlponent)、消費者(consumer)。由于采用了開放的COM接口,增

加數據源支持將變得更加容易,數據提供者只需提供一些基本的服務,在應用層上的數據消費

者就可以獲得各種服務組件提供的服務。

OLEDB/ADO均以COM的方式為數據訪問提供了一致的接口,已經被應用于Microsoft

的各種產品中,并且Microsoft推出的visualStudio開發工具套件也提供了OLEDB組件的開發

支持,因此,OLEDB/ADO將在今后的數據庫應用程序的開發中起到越來越重要的作用。

1.5.3COM在企業中應用

現在的企業或單位的應用大部分都是基于企業內部網絡的應用,這些已經不再局限于由一

個廠家提供所有的產品,而通常是由一些專業廠商提供其專業產品,然后再進行系統集成。從

軟件行業的發展來看,系統集成所占的比重越來越大,而系統集成的一個關鍵的問題是軟件之

間的接口,如果所有的軟件都遵從了同樣的接口標準,則不同軟件產品之間的交互就有了基礎。

顯然COM是可以擔當起這樣的標準的,而且事實上也已經發揮了這樣的作用。在目前較

為流行的多層軟件結構模型中,位于中間層的業務層主要通過COM組件來實現。

1.5.4COM在Internet中的應用

COM在Internet相關的軟件中的發展最能體現COM的優勢,因為Internet軟件要求有很好

的開放性,開放性就意味著要遵從標準。在Windows平臺上,COM就是這樣的標準。Micosoft

提出的ActiveX技術包含了所有基于COM的Internet相關的軟件技術。

第二章組件技術原理

這一章我們將詳細介紹COM規范的有關基礎知識,尤其是COM對接口使用的約定,這部

分內容是COM標準的核心,其他所有的高級技術都建立在此基礎上,因此,對這部分內容的

學習將有助于讀者對其他技術的理解。

本章首先學習COM對象的一些基本知識,然后在學習COM接口的基礎上(在不會引起混

淆的情況下,我們經常直接把COM對象簡稱為對象,把COM接口簡稱為接口)。

2.1對象與接口

在COM規范中,對象與接口是最核心的部分。COM組件提供給客戶的是以對象形式封裝

起來的實體。客戶訪問COM對象的唯一途徑是通過COM接口,因此,COM接口是COM規

范中最關鍵的內容,在COM中接口就是一切。對于客戶來說,一個組件就是一個接口集。客

戶只能通過接口才能同COM組件打交道。

2.1.1COM對象

在COM規范中,并沒有對COM對象進行嚴格的定義,但COM提供的是面向對象的組件

模型,因而對象是它的基本要素之一。類似于C++中對象的概念,對象是某個類的一個實例;

而類則是一組相關的數據和功能組合在一起的一個定義。使用對象的應用(或另一個對象)為客

戶,有時也稱為對象的用戶。

在COM模型中,對象本身對于客戶來說是不可見的,客戶請求服務是通過接口進行,COM

組件提供給客戶的是以對象形式封裝起來的實體。客戶程序與COM組件程序進行交互的實體

是COM對象,它并不關心組件模塊的名稱和位置(即位置透明性),但它必須知道自己在與哪個

COM對象進行交互。

COM對象也包括屬性(也稱為狀態)和方法(也稱為操作),對象的狀態反映了對象的存在,

也是區別子其他對象的要素:COM對象提供的方法就是對象提供給外界的接口,客戶必須通過

接口才能獲得服務。對于COM對象來說,接口是它與外界進行交互的唯一途徑,由此,封裝

特性是COM對象的基本特征。

COM對象的位置對客戶來說是透明的,因為客戶并不直接去訪問COM對象,客戶程序通

過一個全局標識符進行對象的創建和初始化工作。在COM規范中,這個全局標識符是一個128

位全局唯一標識符GU1D,它基本上可以保證COM對象的唯一性。不僅COM對象采用GUID

進行標識,COM接口的標識符也是GUID。

盡管COM對象也是對象,但是COM對象的概念與我們所熟悉的C++中的對象有很大差別。

我們可以從面向對象系統的兒個重要特性上對它們進行比較:

1.封裝特性

數據封裝是兩者都具有的特性,但其形式有所不同。在COM對象中,數據是完全封裝在

對象內部的,外部不可能直接訪問對象的數據屬性,因為COM對象和客戶程序可能在不同的

模塊中甚至在不同的進程中或不同的機器上,因此,客戶直接訪問COM屬性不僅不合理,有

時也不太可能。而且,通過COM對象提供的接口成員函數訪問對象的屬性,為COM對象對屬

性的控制提供了機會,對象可以在成員函數中對新的屬性值進行有效性判斷,若新值合理則接

受,否則便拒絕,還可以引發一些相應的事件。

C++對象的封裝特性與COM對象的封裝有所不同,因為C++對象的使用者與對象往往在

同一個程序模塊中(至少在同一個進程中),所以使用者有可能直接訪問對象中的數據成員,因

此C++語言對類的成員訪問進行控制,類的成員分別為公共數據成員(public)、私有數據成員

(private),保護數據成員(protected)。私有數據成員只能在對象內部直接訪問,在對象外部是訪

問不到的,而公共數據成員可以在對象外部直接訪問,保護數據成員可以在其派生類的成員函

數中訪問。

對于這兩種情況的封裝特性,我們可以這樣來理解,COM對象的數據成員的封裝以組件模

塊為最終邊界,對于對象用戶是完全透明的、不可見的;而C++對象的封裝特性只是語義上的封

裝,對于對象用戶是可見的。

2.可重用性

可重用性是面向對象系統的重要特性,因此也是COM對象和C++對象的共同特性,但兩

者的表現形式不同,COM對象的可重用性表現在COM對象的包容和聚合,一個對象可以完全

使用另一個對象的所有功能;而C++對象的可重用表現在C++類的繼承性,派生類可以調用其父

類的非私有成員函數。

一個COM對象A如果要使用另一個COM對象B的功能,則可以通過兩種方式實現:包容

或聚合。不管哪種形式,COM對象A都可以完全重用對象B的功能,就如同對象A自己實現

了對象B的功能,而且,當對象B更新了版本或者增強了功能時,對象A自動使用新版本的對

象B,而根本不需要重新編譯或者重新設置,因此,COM對象的重用是動態的,可以在對象A

和對象B完全獨立的情況下,對象A重用對象B的功能。

C++對象的重用性表現在源代碼一級的重用性上,通過C++語言的類繼承來實現。從類A

派生得到的類B可以繼承類A的所有非私有成員,包括數據成員和函數成員。但類B與類A

有緊密的派生和繼承關系,當類A的實現作了修改時,則類B必須重新編譯或者需要修改相應

的代碼,然后才能適應新的類A。而且,在最終得到的可執行代碼中,類A和類B在同一模塊

中,重用性只體現在程序模塊的內部,對模塊外部而言,重用性只體現在對代碼的有效管理上。

3.多態性

多態性是C++對象的重要特性,正是C++對象的多態性,才體現了C++語言描述事物的高

度抽象的特征。C++對象的多態性是通過其虛函數得以實現。

COM對象也具有多態性,但這種多態性通過COM接口實現。COM規范允許一個對象實

現多個接口,因此,COM對象的多態性可以在每個接口上得以實現。正是由于COM的多態性,

才可以用COM規范建立插件系統,應用程序可以用統一的方法處理每一個插件,這種插件系

統已經有了很多應用。

2.L2COM接口

在COM規范中,COM接口是最重要的部分,因為COM對象的客戶與對象之間通過接口

進行交互,客戶請求服務是必須通過接口才能進行。COM規范的核心內容就是關于接口的定義,

雖然COM接口本身并不復雜,但圍繞COM接口有許多內容,包括接口的標識、接口函數的調

用習慣、參數處理、接口與對象的關系以及COM接口的特性等。

COM接口是一組邏輯上相關的函數集合,其函數也被稱為接口成員函數。按照習慣,接口

名常以“I”為前綴,例如COM的核心接口IUnknown。COM對象可以提供多個COM接口,

通過每個接口的成員函數為客戶提供各種形式的服務。和COM對象一樣,每一個COM接口都

由一個128位的全局唯一一標識符GUID來標識。客戶通過GU1D獲得接口的指針,再通過接

口指針,客戶就可以調用其相應的成員函數。

COM接口具有如下特點:

二進制特性:接口規范并不建立在任何編程語言的基礎上,而是規定了二進制一級

的標準。任何語言只要有足夠的數據表達能力,就可以對接口進行描述,從而可以用于組

件程序有關的應用開發。

接口不變性:接口是組件客戶程序和組件對象之間的橋梁,接口如果經常發生變化,

則客戶程序和組件程序也要跟著變化,這對于應用系統的開發非常不利,也不符合組

件化程序設計的思想,所以,接口應該保持不變。

繼承性;COM接口具有不變件,但不變性并不意味著接口不再發展,隨著應用系統和

組件程序曲發展,接口也需要發展。類似于C++中類的繼承性,接口也可以繼承發展,但

接口繼承于類繼承不同。首先,類繼承不僅是說明繼承,也是實現繼承,即派生類可以繼

承基類的函數實現,而接口繼承只是說明繼承,即派生的接口只繼承了基接口的成員函數

說明,并沒有繼承基接口的實現,因為接口定義不包括函數實現部分。其次,類繼承允許

多重繼承,一個派生類可以有多個基類,但接口繼承只允許單繼承,不允許多重繼承。

多態性:多態性是面向對象系統的重要特性,COM對象也具有多態性,其多態性通過

COM接口體現。多態性使得客戶可以用統一的方法處理不同的對象,甚至是不同類型的對

象,只要它們實現了同樣的接口。如果幾個不同的COM對象實現了同一接口,則客戶程

序可以用同樣的代碼調用這些COM對象。

2.1.3全局唯一標識符——GUID

前而已經說過,COM組件的位置對客戶來說是透明的,因為客戶并不直接去訪問COM組

件,但又必須知道和那個COM對象進行交互。實際上,客戶程序通過一個全局標識符進行對

象的創建和初始化工作。

COM規范采用了128位全局唯一標識符GUID(GloballyUniqueIdentifier),這是一種好的解

決方案。在不同任何中央授權機構進行協調的情況下,可以用編程的方法來生成具有唯一性的

CUIDoMicrsoftVisualC++提供了兩個建立GUID的程序,一個是UU1DGEN.EXE,該程序是

命令行方式的,另一個則是GUIDGEN.EXE,是一個示例性的VC++對話框應用。例如在運行

UUIDGEN.EXE時將可能會得到如下的表示GUID的串:

(ABE6D0EA-360B-46d0-ABEB-B91E95E669CE)

這是一個隨機數,并不需要專門機構進行分配和管理。

COM對象的GUID稱為CLSlD(classidentifier,類標識符或類ID)。每一個COM接口也使

用一個GUID來標識,稱為IID(interfaceidentifier接口標識符或接口ID)。

2.1.4接口定義語言IDL

在前面的講述中,我們理解了COM規范中,COM接口是最重要的部分,那么如何實現接

口的定義呢,我們采用接口定義語言(IDL)來實現它。接口描述語言提供了一種不依賴于任

何語言的接口描述方法,因此,它可以成為組件程序和客戶程序之間的共同語言。Micrsoft對

其作了擴展,稱為MIDL語言。

實際上,用VC++做有關COM的開發,VC++會為我們自動產生相應的IDL文件,但我們

在這里對它先進行一些了解。下面給出一個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中用到丁許多關鍵詞.下面給出解釋:

Import:類似于C語言中的#include,這里引入了一個頭文件oaidl.idl和另一個IDL文件

ocidl.idl;

Object:表示定義的是COM接口而不是RPC接口(遠程調用接口);

uuid:uuid后面的括號括起來的是接口的IID,是接口的唯一標識符;

interface:interface定義接口名稱;

in和。ut:指定參數的方向。“in”表示輸入參數,“out”表示輸出參數;

pointer_default:為除參數列表中的指另外的所有指針指定缺省類型:

max.is:指定數組的最大元素個數;

sizejs:也用于指定數組或指針的元素數目。

在編寫好[DC文件之后,可以使用VC++提供的MIDL工具,把IDL接口描述文件編譯成

可被組件程序和客戶程序所使用的C源代碼文件。MIDL在VC安裝之后的VC\B1N目錄下。

例如用下面的命令編譯myatlcom.idl:

Midimyatlcom.idl

則產生下面的文件:

Myatlcom.h——包含接口說明的頭文件,可用于C或者C++語言;

Myatlcom_p.c該C文件實現了接口的代理和存根:

Myatlcom_i.c——該C文件定義了IDL文件中用到的所有全局標識待GUID,以及接口

的11D;

dlldata.c——該C文件包含代理及存根的DLL程序的入口函數以及代理類廠所需要的數據

結構。

Myatlcom.tlb該文件為類型庫。

2.2組件應用模型

前面一節介紹了COM的最基本的概念,這一節我們將從COM的整體應用模型來認識

COM=COM應用是基于客戶/服務器模型,COM組件向COM客戶提供服務,并根據COM

對象與COM客戶的位置關系將組件分為進程內組件和進程外組件。在COM客戶與COM對象

的通信過程中COM庫起著于關重要的橋梁作用。當客戶要創建COM對象時,由COM庫從系

統注冊表中找到對象創建的必要信息,所以注冊表在COM應用中起著很重要的作用。本節將

詳細介紹這些內容。

2.2.1客戶/服務器模型

COM對象和客戶之間的相互作用是建立在客戶/服務器模型的基礎之上的。COM服務器實

際上是COM組件對象的容器,由COM服務器內的組件對象向COM客戶提供服務。所以,COM

應用模型可以繼承客戶/服務器模型的許多優勢,比如:高穩定性和可靠性、很強的擴展性、性

能得到提高以及數據庫的事務機制等。COM還可以非常靈活地使用客戶/服務器模型,實現COM

對象的重用機制。(有關COM的客戶/服務器模型的內容可以參看1.3.2節內容)

COM客戶和COM服務器在建立通信連接之前是沒有任何聯系的,COM客戶并不知道

COM服務器位于什么地方,甚至連有沒有這樣的服務器都不知道。當客戶請求某個對象的服務

時客戶只需傳遞該對象類的標識符(CLSID),由COM庫負責找到組件的位置并返回接口指針給

客戶,然后客戶就可以使用接口指針獲得對象的服務。

根據COM客戶和COM服務器是否運行在向一進程地址空間,COM服務器可以分為進程

內COM服務器或進程內組件,和進程外COM服務器或進程外組件。然后根據組件是否和客戶

位于同一臺計算機,進程外組件又可以分為本地組件和遠程組件:

■進程內組件:組件程序被加載到客戶的進程地址空間,在Windows環境下,進程內組

件程序通常以動態鏈接庫(DLL)的形式實現;

■本地組件:組件程序和客戶程序運行在同一臺機器上,但組件程序是一個獨立的應

用程序,通常是一個EXE文件;

■遠程組件:組件程序運行在與客戶不同的機器上,它既可以是一個DLL模塊,也可以

是一個EXE文件。

雖然COM組件對象有不問的進程模型,但這種區別對十客戶程序來說是透明的,客戶程

序在使用組件對象時可以不管這種區別的存在。只要遵照COM規范即可。這種進程透明件的

關鍵在于COM庫,COM庫會負責組件程序的定位,并管理組件對象的創建和對象與客戶之間

的通信。

當客戶創建組件對象時,COM庫負責裝入組件模塊或者啟動組件進程,如果客戶指定的組

件對象程序位于遠程機器上,則兩臺機器上的COM庫會協同完成遠程COM對象的創建工作,

并且在客戶進程個創建一個代理對象(proxyobject),客戶程序直接與代理對象進行交互。

雖然對于客戶程序而言,三種進程類型是透明的,用戶程序可以不必管要創建的是哪種類

型的組件。但是在實現COM組件時,還是應該慎重選擇進程模型:

進程內模型的優點是效率高,但組件不穩定會引起客戶進程崩潰,因此組件可能會危及客

戶;進程外模型的優點是穩定性好,組件進程不會危及客戶程序,一個組件進程可以為多個客

戶進程服務,但進程外組件開銷大,而且調用效率相對低一些。

2.2.2COM庫

從COM應用模型中可以發現了COM庫在整個COM對象體系中起了很重要的作用,COM

庫充當著組件程序和客戶程序之間的橋梁,尤其是在組件對象的創建過程中,以及在對象管理、

內存管理和一些標準化操作等方面起著重要的作用,這一節將分別介紹COM庫在這些方面的

實現方法。

為了使函數調用有效,在進行函數調用之前,首先必須調用COM庫的初始化函數對COM

庫進行初始化,COM庫的初姑化函數為:

HRESULTCoInitialize(IMalloc*pMalloc);

參數pMalloc用于指定一個內存分配器,它是一個IMalloc指針接口,一般情況下,我們直

接把參數設為NULL,則COM庫將使用缺省提供的內存分配器。

函數的返回值有三種可能:

S_OK:表示初始化成功;

S_FALSE:表示初始化雖然成功,但這次調用不是本進程中首次調用初始化函數:

S_UNEXPECTED:表示初始化錯誤,應用秘序不能使用COM庫。

通常,一個進程對COM庫只進行一次初始化,而且,在同一個模塊單元中對COM庫進行

多次初始化并沒有意義。COM庫要求客戶在調用其函數之前,必須先調用初始化函數成功以后

才能進行。

應用程序對COM庫進行初始化之后,就可以調用COM庫所提供的各種服務,在調用過程

中必然要消耗由COM庫管理的資源,尤其是一些影響系統全局的資源,因此,COM程序在用

完COM庫服務之后,通常是在程序退出之前,一定要調用終止COM庫服務函數,以便釋放

COM庫所維護的資源。COM庫的終止函數為:

VoidCoUninitialize(void);

下表列出了COM庫中常用的函數:

類別函數功能

CoBuiMVcrBion獲取COM岸的版本號

CoUnitialize8M庠的初始化

初始化函數

CoUninitkdize8M庫功能股務終止

CoFrveUnusedlibrahes降放進程中所有不再使用的組件程序

UEqualGUlD河斷兩個GUID是否相等

kEqualllD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論