




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、基于COM+的三層應(yīng)用技術(shù)分析1. 系統(tǒng)功能11.1系統(tǒng)需求分析11.2小區(qū)物業(yè)系統(tǒng)的功能模塊12. 系統(tǒng)架構(gòu)22.1兩層框架22.2三層架構(gòu)22.3兩層和三層的優(yōu)缺點33. COM+的由來和演變34. 在delphi中開發(fā)COM+組件54.1建立工程54.2編寫接口函數(shù)64.3注冊和安裝64.4設(shè)置調(diào)試65. COM+技術(shù)分析75.1概念分析75.2 COM+實現(xiàn)代碼分析:85.2.1 GUID8記錄類型8接口95.2.4 接口實現(xiàn)類105.2.5 COM+對象生成156. COM+的優(yōu)缺點186.1COM+的優(yōu)點186.2COM+的缺點181. 系統(tǒng)功能1.1系統(tǒng)需求分析一個小區(qū)的物業(yè),負(fù)
2、責(zé)整個小區(qū)的管理。包含的內(nèi)容有很多,包括對小區(qū)內(nèi)所有的公共設(shè)備和建筑進行管理、維修;對小區(qū)內(nèi)所有的單元戶進行信息統(tǒng)計;對小區(qū)內(nèi)的入住人員進行管理;負(fù)責(zé)小區(qū)內(nèi)的綠化和清潔;查收水電費和物業(yè)費;對小區(qū)內(nèi)車輛進行統(tǒng)計,并收取停車費;提供投訴平臺,并進行處理;對小區(qū)內(nèi)工作人員進行統(tǒng)計;對外來車輛的管理;對小區(qū)內(nèi)工作人員的工資、休假等管理;設(shè)置小區(qū)的單位物業(yè)費用。1.2小區(qū)物業(yè)系統(tǒng)的功能模塊為了在短期內(nèi)實現(xiàn)系統(tǒng),體現(xiàn)開發(fā)和使用COM+組件以及三層架構(gòu)的精髓,將小區(qū)物業(yè)的管理流程進行簡化。系統(tǒng)要實現(xiàn)的模塊如圖1.1所示。圖1.1系統(tǒng)功能模塊單元樓模塊實現(xiàn):錄入小區(qū)內(nèi)的樓棟信息,包括樓棟名稱、高度、一層的房
3、間數(shù)、占地面積等。修改小區(qū)內(nèi)的樓棟信息。單元戶模塊實現(xiàn):錄入小區(qū)內(nèi)的單元戶信息,包括所在樓棟、所在高度、房間號、占地面積、名稱等。修改單元戶的信息,查找單元戶信息等。業(yè)主模塊實現(xiàn):錄入入住人員的基本信息,包括姓名、性別、所在單元戶、入住時間、聯(lián)系電話和身份證號碼。修改業(yè)主信息、刪除業(yè)主信息,查找業(yè)主信息等。投訴模塊實現(xiàn):錄入投訴信息、刪除投訴信息、修改投訴信息等。包括投訴時間、投訴人、投訴內(nèi)容。報修維修模塊實現(xiàn):錄入報修記錄,包括報修時間、報修內(nèi)容。并可修改報修記錄。錄入微機記錄,包括維修時間、維修費用,可修改維修記錄。系統(tǒng)用戶模塊實現(xiàn):添加一個系統(tǒng)用戶,包括用戶名、登錄名、登錄密碼??蓜h除和
4、修改選定記錄。停車位和車輛模塊實現(xiàn):錄入一個車位信息,包括所屬樓和車位編號。錄入車輛和車主信息,并對車輛和車主信息進行修改、刪除、查詢操作。添加一個車位的繳費信息??刹榭茨骋粋€車位的歷史繳費記錄等。水電費和物業(yè)費模塊實現(xiàn):每一個月,錄入所有單元戶的用電量、用水量、應(yīng)繳電費、應(yīng)繳水費、應(yīng)繳物業(yè)費。并可對錄入信息進行修改、查詢。錄入每個單元戶的實際繳費記錄,并可修改、查詢。2. 系統(tǒng)架構(gòu)2.1兩層框架 在數(shù)據(jù)庫開發(fā)中,兩層框架就是C/S模式??蛻魴C試應(yīng)用程序,而服務(wù)器是數(shù)據(jù)庫服務(wù)器。數(shù)據(jù)庫用來存儲系統(tǒng)中的數(shù)據(jù),而應(yīng)用程序則負(fù)責(zé)連接數(shù)據(jù)庫,并擔(dān)當(dāng)了顯示數(shù)據(jù),處理用戶輸入數(shù)據(jù),更新、保存保存數(shù)據(jù)到數(shù)據(jù)
5、庫的任務(wù)。也就是說,客戶機承擔(dān)了數(shù)據(jù)顯示和業(yè)務(wù)流程的所有任務(wù)。而數(shù)據(jù)顯示和整個系統(tǒng)的業(yè)務(wù)也是融合在一起,沒有明顯的分界線的。2.2三層架構(gòu) 三層架構(gòu)與兩層C/S相比,多了一個中間件。中間件也叫做應(yīng)用程序服務(wù)器,中間件負(fù)責(zé)連接數(shù)據(jù)庫,更新并保存數(shù)據(jù)到數(shù)據(jù)庫,響應(yīng)客戶端的請求并返回數(shù)據(jù)等??蛻舳藨?yīng)用程序不再直接與數(shù)據(jù)庫連接,而是通過中間件關(guān)聯(lián),并且所有的業(yè)務(wù)流程和數(shù)據(jù)處理都放置到中間件中??蛻舳酥挥脕盹@示數(shù)據(jù),與用戶進行交互。2.3兩層和三層的優(yōu)缺點因為兩層架構(gòu)的所有操作都集中到客戶端,導(dǎo)致兩層架構(gòu)的客戶端比較龐大,并且更新系統(tǒng)要對所有的客戶端進行更新,不僅難于維護,維護成本也較高。當(dāng)系統(tǒng)模塊中出
6、現(xiàn)重復(fù)的業(yè)務(wù)邏輯也要進行多次編程,代碼復(fù)用率較低。但是采用兩層架構(gòu)有利于團隊間進行模塊化得開發(fā),只要每個人負(fù)責(zé)一個或者多個模塊的數(shù)據(jù)顯示和業(yè)務(wù)處理。因為三層架構(gòu)將數(shù)據(jù)顯示和業(yè)務(wù)邏輯分離,使得客戶端比較小,實現(xiàn)了瘦客戶機的結(jié)構(gòu)。當(dāng)每次更新和升級業(yè)務(wù)處理的時候,都可以只升級服務(wù)器端,降低了維護的成本和難度。此外,三層架構(gòu)將所有的業(yè)務(wù)邏輯進行集中管理,提高了代碼的利用率(相同的業(yè)務(wù)流程,只需要進行一次編程,在不同的模塊中進行調(diào)用即可)。但是,與兩層架構(gòu)相比,三層架構(gòu)的系統(tǒng)也由它的不足之處。三層架構(gòu)的中間層可以是以dll動態(tài)鏈接庫或者EXE可執(zhí)行程序的形式存在,但不管是哪一種方式,都導(dǎo)致三層框架的系統(tǒng)
7、在編碼和調(diào)試的時候,更容易出錯。三層框架系統(tǒng)的速度和效率也低于兩層架構(gòu)的系統(tǒng)。并且業(yè)務(wù)邏輯和顯示層也不容易分割,容易出現(xiàn)設(shè)計問題。Delphi的三層框架技術(shù),也由一定難度,入門到完全掌握需要比較長得時間。3. COM+的由來和演變COM(component object model,組件對象模型)是客戶端和COM對象之間進行交流的一種二進制規(guī)范。這個規(guī)范允許用合適的語言把一些代碼編程一個組件,并且允許在編程語言中使用這個組件或功能,即使語言不通,也不會有問題,所以說COM是跨語言的,并且與編程語言無關(guān)。COM要實現(xiàn)的就是客戶和正在使用的COM對象的透明定位。而所謂的合適的語言是指:COM的跨語
8、言特性是狹隘的。理論上,COM生成的dll動態(tài)鏈接庫或者EXE可執(zhí)行程序可以被任何語言所使用,但是一些非面向?qū)ο蟮木幊陶Z言,比如VB,就不能用來創(chuàng)建和使用COM對象。COM除了是一個二進制規(guī)范外,還是一種實現(xiàn)。它以一個COM庫和一組API函數(shù)的形式,提供了創(chuàng)建和管理COM對象的途徑。同時,它還可以說是一個服務(wù),它為其他的應(yīng)用程序提供了COM組件實現(xiàn)的接口函數(shù)。無論COM是以進程內(nèi)(In-Process,dll動態(tài)鏈接庫的形式)COM還是以進程外(Out-Process,可執(zhí)行程序的形式)COM的形式,都只能為本機內(nèi)的應(yīng)用程序提供服務(wù),使用COM組件內(nèi)的接口函數(shù)。為了解決COM在分布式上的缺陷,
9、使COM能夠在不同的計算機之間進行通信,Microsoft又研發(fā)了DCOM。DCOM(分布式COM)是對COM的進一步的擴展,一種無縫的擴充技術(shù)。DCOM使COM能夠支持在局域網(wǎng)、廣域網(wǎng)甚至Internet上不同計算機的對象之間的通訊。DCOM的跨計算機的特性,是因為DCOM封裝了網(wǎng)絡(luò)通訊的底層細(xì)節(jié),使開發(fā)者致力于應(yīng)用程序的業(yè)務(wù)邏輯開發(fā)。MTS(Microsoft Transaction Server,事務(wù)處理服務(wù)),它是Windows NT操作系統(tǒng)推出的一個中間件產(chǎn)品。Microsoft提出這個服務(wù),是為了支出開發(fā)企業(yè)應(yīng)用程序中多線程和分布式事務(wù)等復(fù)雜事務(wù)的處理,讓windows程序員開發(fā)以
10、組件為向?qū)У姆植际綉?yīng)用系統(tǒng)。MTS具備在同質(zhì)和異質(zhì)數(shù)據(jù)庫之間的數(shù)據(jù)進行Two phase commit的功能,允許大量的客戶端應(yīng)用程序同時執(zhí)行,并提供了數(shù)據(jù)庫事務(wù)的管理工作。將MTS和DCOM結(jié)合起來,很容易的就能開發(fā)出一個支持事務(wù)處理和多線程、并且保證能夠運行在同一臺或者不同的機器上的中間件作為一個系統(tǒng)的應(yīng)用服務(wù)器。出現(xiàn)DCOM和MTS之后,開發(fā)分布式的系統(tǒng)的基本框架就可以采用如圖3.1所示的多層框架。圖3.1COM/MTS多層框架雖然MTS的出現(xiàn),為COM提供了事務(wù)處理,安全控制,資源分發(fā)控制等服務(wù),為COM開發(fā)提供了一個比較完整的系統(tǒng)結(jié)構(gòu)。但是,因為歷史的原因,DCOM和MTS的優(yōu)勢還不
11、為windows程序員所認(rèn)識,DCOM和MTS也不能很好的進行融合。于是,在Windows 2000中,微軟引進了COM+的概念。COM+不是對COM的簡單升級,它幾乎包含了COM所有的功能,并且融合了DCOM和MTS的核心技術(shù)。也就說說,COM+不僅可以提供了客戶程序和COM+組件之間的透明定位,無論這個客戶程序和COM+組件是不是在一個計算機中,同時,COM+也提供了對事務(wù)的處理、事件機制、目錄和基于角色的安全機制等系統(tǒng)服務(wù)。COM+的出現(xiàn)使得開發(fā)一個三層框架的系統(tǒng)更加清晰和簡單。如圖3.2COM+三層框架。圖3.2 COM+三層架構(gòu)4. 在delphi中開發(fā)COM+組件4.1建立工程在d
12、elphi的集成開發(fā)環(huán)境中,提供了創(chuàng)建COM+組件的模板。按照如下的七個步驟就能創(chuàng)建一個COM+組件的框架。1、 打開delphi集成開發(fā)工具2、 選擇File菜單下的Newother選項3、 在對話框中,選擇ActiveX頁面4、 選擇Transactional Object類型的工程,進行創(chuàng)建5、 在彈出的對話框中,輸入Coclass Name。6、 選擇線程模式為Aparment(默認(rèn))7、 選擇事務(wù)支持模式為Supports transactional。4.2編寫接口函數(shù)創(chuàng)建工程后,Delphi集成開發(fā)工具會自動創(chuàng)建三個文件。一個工程文件,一個類型庫文件,一個COM+接口實現(xiàn)類文件。在
13、delphi中編寫COM+組件十分容易,只要打開類型庫編輯器,在類型庫編輯器中,添加接口、接口函數(shù)、枚舉類型的變量或者記錄類型。在類型庫編輯器中所做的操作,都會直接反應(yīng)到類型庫文件中。并且添加的接口函數(shù)的實現(xiàn)代碼也會添加到實現(xiàn)類文件中。程序員要做的,就是填充實現(xiàn)類中不完整(實際上時沒有一行代碼的空函數(shù))的函數(shù)實現(xiàn)代碼,來完成系統(tǒng)的業(yè)務(wù)流程。4.3注冊和安裝編寫完COM+組件要實現(xiàn)的接口和服務(wù)之后,要為其他的應(yīng)用程序提供服務(wù)還需要將COM+組件注冊到操作系統(tǒng)中。如果用delphi集成開發(fā)環(huán)境進行開發(fā),可以選擇RUN菜單下的Register ActiveX Server選項,將COM+組件注冊到注
14、冊表中。此外,還可以運行windows提供的一個程序Regsvr32.exe 來注冊組件。接著將COM+組件安裝到操作系統(tǒng)的COM+應(yīng)用程序中。選擇RUN菜單下的Install COM+ Objects選項。在對話框中選擇一個COM+應(yīng)用程序,或者創(chuàng)建一個新的COM+應(yīng)用程序。Delphi開發(fā)環(huán)境會自動將COM+組件添加到COM+應(yīng)用程序中。之后,就能夠在組件服務(wù)中,找到我們開發(fā)的這個COM+組件。安裝COM+組件還有另外的一種方式就是,打開控制面板,進入管理工具。選擇組件服務(wù),并打開COM+應(yīng)用程序列表。右鍵通過向?qū)Ы⒁粋€新的COM+應(yīng)用程序,并將建立的COM+組件添加到COM+應(yīng)用程序中
15、去。4.4設(shè)置調(diào)試在客戶端應(yīng)用程序調(diào)用COM+組件接口函數(shù)的時候,為方便調(diào)試,需要對COM+應(yīng)用程序和工程進行設(shè)置。因為默認(rèn)情況下,COM+是被自動調(diào)用和啟動的。設(shè)置過程如下:1、 在組件服務(wù)的COM+組件中,找到新添加的COM+組件應(yīng)用程序。2、 設(shè)置該COM+應(yīng)用程序的屬性高級頁面,選中在調(diào)試器中打開,并設(shè)置正確的調(diào)試路徑。3、 設(shè)置COM+工程。在Project菜單下,選中Options選項。4、 選中對話框的Link頁面。5、 選中EXE and DLL options下的兩個選項(include TD32 debug info和include remote debug symbols
16、)。6、 選中Run菜單下的Parameters選項。7、 選中對話框的Local頁面。8、 填寫Host Application為默認(rèn)值,填寫Parameters為COM+應(yīng)用程序的GUID值。這樣就能進行調(diào)試了。5. COM+技術(shù)分析5.1概念分析前面出現(xiàn)的概念有:接口、COM+組件,COM+應(yīng)用程序。這三者之間的聯(lián)系如圖5.1所示:圖5.1接口、組件和COM+應(yīng)用程序也就是說一個COM+組件是由接口構(gòu)成的,它可以包含多個接口。而一個COM+應(yīng)用程序可以封裝多個COM+組件。5.2 COM+實現(xiàn)代碼分析:前面一章節(jié)中講到在創(chuàng)建工程之后,就生成了一個類型庫文件,該文件以*_TLB命名。*為工
17、程文件的名稱,同時也會生成一個實現(xiàn)接口的類文件稱之為實現(xiàn)類文件。在類型庫文件中,定義了三個GUID和接口以及自定義的函數(shù)和記錄類型。而在實現(xiàn)類文件則包含了在類型庫文件中定義的所有接口函數(shù)的實現(xiàn)代碼。 GUIDGUID(Globally Unique Identifier,全球唯一標(biāo)識符),是一個唯一性的標(biāo)識符。在類型庫文件的一開始,就定義了三個GUID類型的常數(shù)。1、 LIBID_Server:代表了唯一的類型庫,它是COM+對象實現(xiàn)的類型庫的ID2、 IID_Iuptown代表了唯一的接口,是COM+對象的一個接口的ID3、 CLASS_uptown用于將COM+組件注冊到注冊表或者解除注冊
18、的時候起著關(guān)鍵性的作用,是生成COM+對象的重要標(biāo)識符。記錄類型在類型庫編輯器中添加一個記錄類型,delphi集成開發(fā)環(huán)境就會在類型庫文件中自動添加對記錄類型的定義。舉例說明,在類型庫編輯器中添加一個記錄類型的變量并命名為Build,為這個記錄添加多個字段并設(shè)置每個字段的類型。點擊刷新按鈕后,在類型庫文件中,就能看到剛剛添加的記錄類型的定義。Build = packed record b_ID: Int64; b_name: WideString; b_address: WideString; b_high: Int64; b_home: Int64; b_size: Double; b_li
19、ft: WideString;end;首先,這個記錄類型與我們在delphi中自己定義的記錄類型的區(qū)別是,多了一個packed的關(guān)鍵字。在delphi中,為了加快取記錄類型變量各個字段的速度,進行了這樣的優(yōu)化:變量都是字節(jié)對齊的方式。所以會出現(xiàn)sizeof操作出來的結(jié)果和記錄類型的變量大小不一樣的情況。而packed關(guān)鍵字要求對記錄類型進行壓縮,也就是說避免了delphi對記錄類型的優(yōu)化。這么做不進節(jié)省了空間,更重要的是保證了不同的程序進行通信的時候不出錯。正是因為COM+組件允許不同的進程調(diào)用它提供的服務(wù)(接口函數(shù)),該記錄除了使用packed進行壓縮外,每個變量的類型也與一般的delphi
20、應(yīng)用程序有區(qū)別。比如用WideString代替String或者shortstring類型,用Int64代替Interget類型。事實上,在編寫COM+組件的時候,不管是函數(shù)或者過程的參數(shù)還是記錄類型的變量等,所有的對外變量都采用特殊的參數(shù)類型。這么做的好處是使得與其他進程進行通信的時候,互相兼容。接口COM+組件的基礎(chǔ)就是接口。編寫COM+組件最重要也是編寫COM+組件中的接口和接口中的函數(shù)。那么什么是接口呢?接口類似于delphi中的抽象類。因此不能定義一個接口的實例。但與抽象類的區(qū)別是,接口僅僅包含了一組實現(xiàn)不同功能的函數(shù)和過程,卻不能定義變量。也不能對接口中的函數(shù)限定范圍。所有的函數(shù)和過
21、程都默認(rèn)是public的,不存在private或者protect等修飾。并且接口是用關(guān)鍵字interface定義的,而不是用class。下面就是一個接口的定義:Iuptown = interface(IDispatch) 'CE8179DC-5579-4C47-BBFF-0CA70D28541E' function ConnectToDB: WideString; safecall; function ExecSQL(const sqlString: WideString): OleVariant; safecall; function DisConnect: WideStri
22、ng; safecall; function InsertToBuild(BuildbRecord: Build; out outString: WideString): Int64; safecall; function InsertToHome(HomeRecord: Home; out outString: WideString): Int64; safecall; function InsertToPeople(PeopleRecord: People; inHomeDate: TDateTime; out outString: WideString): Int64; safecall
23、; function SetParameter(const p_name: WideString; const p_value: WideString; var outString: WideString): Int64; safecall; function InsertToCar(CarRecord: Car; out outString: WideString): Int64; safecall; function UpdateCarUse(CarRecord: Car; out outString: WideString): Int64; safecall; ··&
24、#183;···從接口函數(shù)的聲明中可以看到,每個函數(shù)都有safecall標(biāo)注。原因是:普通函數(shù)都是采用register寄存器調(diào)用方式,delphi為register調(diào)用方式的函數(shù)的參數(shù)提供最多三個寄存器,用來提高函數(shù)調(diào)用的速度,超過三個的參數(shù)則采用堆棧方式。并且register調(diào)用采用從左到右的順序?qū)?shù)進行賦值。而COM接口默認(rèn)的方法調(diào)用時stdcall標(biāo)準(zhǔn)調(diào)用,即使全部參數(shù)采用堆棧方式的調(diào)用形式來保持COM的跨語言兼容性。而COM+組件中的接口,是雙重接口。在類型庫編輯器中,定義一個函數(shù)的時候,所有的函數(shù)返回值都默認(rèn)為HResult。這是自動化對象中所有函數(shù)都
25、要符合的一個規(guī)則。要創(chuàng)建一個想要有返回值的函數(shù),就將參數(shù)定義為out類型,或者將最后一個參數(shù)的返回值設(shè)定為函數(shù)名稱,類型為out+Refval類型。采用這種方式定義的函數(shù)可以捕捉異常,即使是方法中未被處理的異常,也可以被外套處理并通過HReuslt返回給調(diào)用者。在定義COM+組件的時候,要捕捉函數(shù)調(diào)用的異常,必須使用函數(shù)OLECheck進行檢查。另外,windows中,標(biāo)準(zhǔn)的調(diào)用順序都是從右到左的。 接口實現(xiàn)類接口只有虛函數(shù),并且不能創(chuàng)建變量。要實現(xiàn)接口的函數(shù),就是生成一個接口的實現(xiàn)類。這個實現(xiàn)類繼承了一個對象類(Tobject的派生類),并包含一個或者多個接口。小區(qū)物業(yè)管理系統(tǒng)的實現(xiàn)類定義如
26、下:Tuptown = class(TMtsAutoObject, Iuptown) private con: TADOConnection; function ConnectToDB: WideString; safecall; function DisConnect: WideString; safecall; protected function ExecSQL(const sqlString: WideString): OleVariant; safecall; function InsertToBuild(BuildbRecord: Build; out outString: Wid
27、eString): Int64; safecall; function InsertToHome(HomeRecord: Home; out outString: WideString): Int64; safecall; function InsertToPeople(PeopleRecord: People; inHomeDate: TDateTime; out outString: WideString): Int64; safecall;······ public procedure initialize; override;
28、destructor Destroy; override;從delphi的集成開發(fā)環(huán)境中,可以看到小區(qū)物業(yè)管理系統(tǒng)中COM+組件的接口實現(xiàn)類Tuptown的繼承關(guān)系如圖5.2所示:圖5.2實現(xiàn)類的繼承關(guān)系 父類的含義1、TComObjectTComObject實現(xiàn)了IUnknown、ISupportErrorInfo、標(biāo)準(zhǔn)的COM聚集支持和一個對應(yīng)的類工廠支持。如果我們想創(chuàng)建一個輕量級的可連接客戶端的基于IUnknown接口的COM對象的話,COM對象就應(yīng)該從TComObject 類繼承。 2、TComObjectFactoryTComObjectFactory 是同TComObject對象配
29、合工作的。它把對應(yīng)的TComObject 公開為CoClass。TComObjectFactory 提供了CoClass的注冊功能(根據(jù)CLSIDs、線程模式、應(yīng)用程序ID等)。還實現(xiàn)了IClassFactory 和 IClassFactory2 接口以及標(biāo)準(zhǔn)的COM 對象許可證支持。簡單地說如果要想創(chuàng)建TComObject對象,就會同時需要TComObjectFactory對象。3、TTypedComObjectTTypedComObject等于TComObject 和對IProvideClassInfo接口的支持。IProvideClassInfo 是自動化的標(biāo)準(zhǔn)接口用來公開一個對象的類型
30、信息的(比如可獲得的名字、方法、支持的接口等,類型信息儲存在相關(guān)的類型庫中)。TTypedComObject 可以用來支持那些在運行時能夠瀏覽類型信息的客戶端,比如Visual Basic的TypeName 函數(shù)期望一個對象能夠?qū)崿F(xiàn)IProvideClassInfo 接口,以便通過類型信息確定對象的文檔名稱(documented name)。4、TTypedComObjectFactoryTTypedComObjectFactory 是和TTypedComObject配合工作的。就等于TComObjectFactory + 提供緩存了的TTypedComObject類型信息(ITypeInfo
31、)引用。一句話,創(chuàng)建TTypedComObject必然會同時創(chuàng)建TypedComObjectFactory 類工廠。5、TAutoObjectTAutoObject 等于TTypedComObject+實現(xiàn)IDispatch接口。TAutoObject適用于實現(xiàn)支持自動化控制的COM對象。6、TAutoObjectFactoryTAutoObjectFactory顯然是同TAutoObject密不可分的。它等于TTypedComObjectFactory +提供了TAutoObject的接口和連接點事件接口的緩存類型信息 (ITypeInfo)。7、TMtsAutoObjectDelphi幫助
32、文檔中,是這么描述TMtsAutoObject類的:TMtsAutoObject是MTS應(yīng)用程序服務(wù)器的MTS對象和接口的裝載器。而MTS自動化對象是那些完成了IObjectControl接口的雙重接口自動化服務(wù)器。MTS自動化對象將MTS的事物處理、安全機制等特性和自動化對象的特征融合在一起。從這段話中,可以看出,所有的MTS對象都是要完成IObjectControl接口的。 IUnknown接口從圖中可以看出,所有的接口的祖先都是IUnknown接口。IUnknown是定義在system.pas文件中的一個接口。它的定義如下:type IInterface = interface '
33、;00000000-0000-0000-C000-000000000046' function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end; IUnknown = IInterface;可以看到,IUnknown接口包含了三個函數(shù)。因為接口所有的函數(shù)都是公共的虛函數(shù),所以這三個函數(shù)都是由IUnknown的派生類來實現(xiàn)的。1、 QueryInterface函數(shù)
34、:返回某個COM對象中的接口指針的函數(shù)。從圖上可以看出,一個類可以繼承一個父類和多個接口,并且一個COM對象可以聚合多個內(nèi)部接口。如果在應(yīng)用程序中,使用COM對象沒有定義或者包含的接口,就會提示接口不存在等錯誤信息。因此使用一個接口前可以使用QueryInterface函數(shù)判斷某一個COM對象是否包含了將要使用到的接口。調(diào)用該函數(shù)的時候,輸入?yún)?shù)是某個接口的ID(IID),當(dāng)該COM對象實現(xiàn)了要查找的接口的時候,就返回數(shù)值S_OK(數(shù)值0),而如果沒有找到該接口,則返回數(shù)值E_NOINTERFACE (數(shù)值HRESULT($80004002))。2、 _AddRef函數(shù):接口是引用計數(shù)的。當(dāng)客
35、戶端從COM對象中獲得一個接口時,該函數(shù)就增加了一個接口的引用計數(shù)。3、 _Release函數(shù):而當(dāng)客戶端釋放了接口調(diào)用時,該函數(shù)釋放掉一個了接口的引用計數(shù)。這三個函數(shù)的實現(xiàn),定義在類TComObject中。詳細(xì)如下:TComObject = class(TObject, IUnknown, ISupportErrorInfo) Private······FRefCount: Integer;······ protected IUnknown function IUnknow
36、n.QueryInterface = ObjQueryInterface; function IUnknown._AddRef = ObjAddRef; function IUnknown._Release = ObjRelease; IUnknown methods for other interfaces function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall;function _Release: Integer; stdcall;
37、83;·····Publicfunction ObjAddRef: Integer; virtual; stdcall;function ObjQueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;function ObjRelease: Integer; virtual; stdcall;······需要提到的是,因為聚合的原因,使得一個IUnknown的派生類中,可能包含了同名的接口函數(shù)。如果這些接
38、口函數(shù)的實現(xiàn)是相同的,就定義一個共同的方法。但如果是不同的實現(xiàn)函數(shù),就需要使用到方法分辨子句。在TComObject類的定義中,function IUnknown.QueryInterface = ObjQueryInterface; function IUnknown._AddRef = ObjAddRef; function IUnknown._Release = ObjRelease;這三條語句就是方法分辨語句。當(dāng)調(diào)用IUnknown的三個函數(shù)的時候,實際上是在執(zhí)行ObjAddRef、ObjRelease、ObjQueryInterface這三個函數(shù)。ObjAddRef和ObjRelea
39、se函數(shù)共同維護了接口的引用計數(shù)變量FRefCount,承擔(dān)了COM+組件的生存期。這兩個函數(shù)和變量FRefCount只在控制COM+組件的生存期的時候才有用,其他時候完全沒有意義。在delphi編程中,可以不用考慮這兩個函數(shù)的調(diào)用,系統(tǒng)會自動管理FRefCount變量。但是一旦脫離了delphi,就需要程序員自己調(diào)用_AddRef 和_Release函數(shù)來管理COM+組件的生存期。 創(chuàng)建接口的函數(shù)在創(chuàng)建工程的一開始,就輸入了一個CoClass name。這個名字,在*_TLB文件末尾出現(xiàn)。Couptown = class class function Create: Iuptown; cla
40、ss function CreateRemote(const MachineName: string): Iuptown; end;用delphi集成開發(fā)環(huán)境創(chuàng)建的每一個COM+接口,都會有一個對應(yīng)的CoClass與之對應(yīng)。這個CoClass是系統(tǒng)自動生成的,用來創(chuàng)建接口的函數(shù)。它提供了兩個函數(shù),一個用來創(chuàng)建本地COM+組件接口,另一個用來創(chuàng)建遠(yuǎn)程的COM+組件接口。這兩個函數(shù)調(diào)用了操作系統(tǒng)中的動態(tài)鏈接庫函數(shù),并使用olecheck函數(shù)來判斷是否接口創(chuàng)建成功。詳細(xì)的內(nèi)容將在COM+是如何啟動的那一章節(jié)中講述。現(xiàn)在需要知道的是,CoClass的兩個函數(shù),在COM+對象的創(chuàng)建中,起了關(guān)鍵的作用。
41、COM+對象生成用來創(chuàng)建COM+對象的接口的函數(shù),已經(jīng)清楚了。那么接口實現(xiàn)類是如何創(chuàng)建并和接口聯(lián)系在一起的呢?COM+對象的創(chuàng)建和初始化,都在接口實現(xiàn)類文件最后的initialization部分。initialization部分是delphi用于初始化的特殊部分。當(dāng)程序啟動后,會先行調(diào)用這部分的代碼進行初始化。小區(qū)物業(yè)管理系統(tǒng)服務(wù)器的初始化代碼如下:initialization TAutoObjectFactory.Create(ComServer, Tuptown, Class_uptown,ciMultiInstance, tmApartment); ComServer:TComServe
42、r。ComServer是定義在ComServ單元的全局變量。該變量是用來注冊和撤銷注冊COM+服務(wù)的對象。 Tuptown是程序員自己創(chuàng)建的接口實現(xiàn)類。 Class_uptown是GUID類型的常量。將COM+注冊到注冊表的HKEY_CLASSES_ROOT/CLSID目錄下,就要用到Class_uptown常量值。 ciMultiInstance是服務(wù)器的實例模式。COM+組件服務(wù)器,可以有以下三種實例模式,默認(rèn)為Mulitple Instance方式。1、Internal:供COM對象內(nèi)部使用,不會響應(yīng)客戶端的請求,只能通過COM對象內(nèi)部的其他方法建立。2、Single Instance:
43、不論當(dāng)前系統(tǒng)內(nèi)部是否存在相同COM對象,都會建立一個新的程序及獨立的對象實例。3、Mulitple Instance:如果有多個相同的COM對象,只會建立一個程序,多個COM對象的實例共享公共代碼,并擁有自己的數(shù)據(jù)空間。 tmApartment是COM+服務(wù)器的線程模式。COM+服務(wù)器的線程模式一下五種:1、Single:僅單線程,處理簡單,吞吐量最低;2、Apartment:COM程序多線程,單個COM對象處理請求單線程;3、Free:一個COM對象的多個實例可以同時運行。吞吐量提高的同時,也要求對COM對象進行必要的保護,以避免多個實例沖突;4、Both:同時支持Aartment和Free
44、兩種線程模式。5、Neutral:只能在COM+下使用。在這個函數(shù)里面,可以看到建立工程的時候所選擇的線程模式等服務(wù)器特征最終都是以代碼的形式控制和實現(xiàn)的。前面已經(jīng)提到了TAutoObjectFactory類,它是創(chuàng)建TAutoObject類對象的工廠類。TAutoObjectFactory的create函數(shù)遞歸調(diào)用了它的父類的工廠類的create函數(shù),并進行初始化。這個函數(shù)提供了創(chuàng)建COM+對象所需要的所有的信息。在TComObjectFactory.Create函數(shù)中,有這么一句話:ComClassManager.AddObjectFactory(Self)。這個函數(shù)的作用,就是將創(chuàng)建的COM+對象加入到COM的管理器中進行管理。 初始化程序又是怎么被調(diào)用的呢?客戶端調(diào)用CoClass的create或者CreateRemote函數(shù)用來返回一個COM+對象的接口。
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藤制品企業(yè)的品牌形象傳播策略考核試卷
- 電機在消防設(shè)備的緊急響應(yīng)考核試卷
- 人教版《分?jǐn)?shù)的概念與應(yīng)用》課件
- 谷物儲存的糧食儲存容量提升考核試卷
- 塑料制品的環(huán)保法規(guī)遵守考核試卷
- 新車上戶需要什么手續(xù)和上戶流程
- 環(huán)境衛(wèi)生課件
- 網(wǎng)絡(luò)安全防護在能源交易平臺的數(shù)據(jù)保護評估考核試卷
- 耐火土石礦山綠色開采與循環(huán)經(jīng)濟考核試卷
- 2025年石英或云母填充塑料項目建議書
- 2022年巫山縣教師進城考試筆試題庫及答案解析
- 青少年模擬法庭劇本(敲詐勒索)
- 萬用表校準(zhǔn)報告
- 新聞采訪與寫作(馬工程筆記)
- DB32∕T 1703-2011 科技成果轉(zhuǎn)化服務(wù)規(guī)范總則
- SQ-02-綠色食品種植產(chǎn)品調(diào)查表0308
- 視頻結(jié)構(gòu)化大數(shù)據(jù)平臺解決方案
- SolidWorks、CAD三維建模練習(xí)習(xí)題圖
- 光伏發(fā)電項目安全專項投資估算方案
- 大學(xué)生物技術(shù)分析教材與教學(xué)設(shè)計
- 皮爾遜Ⅲ型曲線模比系數(shù)計算(共享版).xls
評論
0/150
提交評論