程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第八章-對象鏈接與嵌入(二)(3)

第八章-對象鏈接與嵌入(二)(3)

編輯:Delphi

8.4.2 創建OLE自動化服務器 

OLE自動化服務器是應用程序或動態鏈接庫(DLL),它可向OLE 自動化控制器輸出OLE對象。 MemoEditdpr 就是OLE 自動化服務器, 在MemoAuto 單元中注冊了MemoEdit.Appdication自動化類,所有OLE控制器均可對MemoEdit.Application進行引用。

在Windows環境下有兩種OLE自動化服務器,進程內服務器和進程外服務器, Delphi可創建這兩種服務器。

進程內服務器是輸出OLE自動化對象的動態鏈接庫。因為OLE自動化對象來自於DLL,

對象是控制器程序的同一窗體進程,進程內服務器適合於創建共享的程序模塊, 而這個模塊可以被用不同語言編寫的多個程序所共享。 進程內服務器被調用時在同一地址中運行,這樣就不需要控制器進行調度,以避免處理大量的消息句柄。 進程外服務器是能輸出OLE自動化對象的應用程序。

有些OLE自動化服務器只能創建和輸出一個OLE對象,有些服務器則可以處理多個OLE對象,另外一些服務器不能輸出OLE對象,只能在程序內部使用OLE對象。 服務器與其能輸出的對象數目的關系稱為實例(instancing)。

在創建OLE 自動化對象時必須定義實例, 這樣, 在創建一個OLE 自動化對象時,Windows就能決定是否創建一個新的服務器實例。表8.5列出三種實例類型。

表8.6 實例的取值及含義

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

instancing類型          含義

─────────────────────────────── ───────

internal OLE對象是應用程序的內部對象,對象不需要注冊,外部進程不能創

        建此對象

Single 每個服務器實例只能輸出一個OLE對象實例, 若控制器需要多個OLE

        對象實例,WIndows為第一個OLE對象創建一個服務器實例

Multiple 一個服務器能創建和輸出多個OLE 對象實例, 進程內服務器大多是

       Multiple類型

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

每個使用OLEAuto單元的工程文件自動地擁有一個叫Automation的對象,它是非可視對象。就象Application部件擁有Delphi應用程序的一些信息一樣,Automation對象也擁有服務器的一些信息,其中最重要的是StartMode屬性和OnLastRelease事件。

StartMode指示OLE自動化服務器打開方式打開的目的。表8.7列出StartMode四種取值。 

表8.7 StartMode 的取值及含義

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

取值          含義

───────────────────────────────

SmStandAlone 用戶啟動應用程序

SmAutomation Windows為創建OLE對象而啟動程序

SmRegSever 應用程序僅為注冊一個或多個OLE對象而啟動

SmUnregSever 應用程序僅為注銷一個或多個OLE對象而啟動

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

當StartMode模式是SmAutomation,而用戶不再需要服務器時發生OnLastRelease 事件。此時所有OLE控制器釋放了由服務器創建的對象。缺省情況下,服務器關閉實例,但OnLastRelease 事件可根據實際情況是否關閉。OnLastRelease 事件可得到一個叫ShutDown的布爾型變量。把ShutDown設置成True,則在最後一個OLE對象釋放時服務器不關閉。

無論創建何種自動化服務器,必須定義對控制器的界面,包括定義和注冊OLE對象,OLE自動化對象的屬性和方法。定義界面主要是為了控制器能夠引用它們。

對已存在的自動化服務器界進行修改時,要確保向上兼容 ,不要刪去已有的屬性、方法,這樣會導致已存在的自動化控制器發生錯誤,修改服務器只能增加屬性和方法。

創建OLE自動化服務器第一步是創建服務器自身。即創建能輸出OLE 對象的應用程序或動態鏈接庫。這主要取決於是創建進程內服務器還是進程外服務器。

創建進程內服務器,即動態鏈接庫:

1.創建動態鏈接庫;

2.在工程文件的uses條款中加入OLEAuto單元;

3.在DLL中輸出四個標准入口,即加入以下代碼。 

exports

DLLGetClassObject,DLLCanUnloadNow;

DLLRegisterServer,DLLUnregisterServer; 

以上代碼必須准確拼寫,包括大小寫。與Object Pascal的其它項目不同,這些代碼

對大小寫敏感。

創建進程外服務器:

1.創建一個Delphi應用程序;

2.在工程文件的begin之後加入以下代碼; 

if Automation,Server Registration then Exit; 

創建服務器之後,應該向服務器加入OLE自動化對象,這個過程大部分是自動完成的,但必須向Delphi的自動化對象專家提供必要的信息。

把OLE自動化對象加入服務器:

1.在Delphi集成開發環境中選擇File| New 菜單項, 並在對象集中選擇Automation

Object,Delphi打開自動化對象專家。

2.給自動化對象命名

 這是服務器內部標識OLE對象的名字,必須是個有效的面象對象Pascal標識符,習慣上以T字母開頭;

3.給OLE類命名

 該名用以外部控制器創建對象。當服務器在Windows中注冊OLE對象, 就以這個名字在系統注冊。控制器使用這個名字調用CreateOLEObject來創建對象。

4.描述要輸出的對象。

5.定義對象的實例(instancing),進程內服務器常定義為Multiple,進程外服務器常定義為Single;

6.選擇OK鍵完成該過程

 自動化對象專家將產生以下代碼:

 ● 從TAutoObject派生下來的自動化對象定義,但沒有定義任何屬性方法;

 ● 調用DelphiOLE自動化管理器的注冊代碼,管理器負責Windows中注冊服務器和對象。 

在注冊代碼中包括一個自動產生的ID號,這個ID號是全局唯一的,通常不要修改。每個ID號與一個OLE類名相對應,如果其中之一被改變,應用程序在使用時會發生錯誤。

在創建了服務器並把OLE自動化對象加入服務器之後,控制器程序就可以對服務器進行操縱。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved