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自動化對象加入服務器之後,控制器程序就可以對服務器進行操縱。