注冊後的OLE自動化對象是引用記數的因為對象可能被多個控制器控制當使用完一個OLE對象調用Release方法Release可減少引用數目當引用數目為零時調用Free方法釋放對象
通常把OLE對象作為變體類型(variants)進行輸出任何OLE 對象的方法和屬性必須返回一個包含OLE對象的變體類型TAutoObject提供了一個變體類型的OLEObject屬性控制器不能直接得到服務器中的類或指針而是引用OLE對象的OLEObject屬性
例程MemoAuto單元的NewMemo函數就是通過引用OLEObject 屬性而提供引用TMemoDoc對象的接口
function TMemoAppNewMemo : Variant;
begin
Result := MainFormCreateMemo( )OleObject;
end;
創建OLE自動化服務器
OLE自動化服務器是應用程序或動態鏈接庫(DLL)它可向OLE 自動化控制器輸出OLE對象 MemoEditdpr 就是OLE 自動化服務器 在MemoAuto 單元中注冊了MemoEditAppdication自動化類所有OLE控制器均可對MemoEditApplication進行引用
在Windows環境下有兩種OLE自動化服務器進程內服務器和進程外服務器 Delphi可創建這兩種服務器
進程內服務器是輸出OLE自動化對象的動態鏈接庫因為OLE自動化對象來自於DLL
對象是控制器程序的同一窗體進程進程內服務器適合於創建共享的程序模塊 而這個模塊可以被用不同語言編寫的多個程序所共享 進程內服務器被調用時在同一地址中運行這樣就不需要控制器進行調度以避免處理大量的消息句柄 進程外服務器是能輸出OLE自動化對象的應用程序
有些OLE自動化服務器只能創建和輸出一個OLE對象有些服務器則可以處理多個OLE對象另外一些服務器不能輸出OLE對象只能在程序內部使用OLE對象 服務器與其能輸出的對象數目的關系稱為實例(instancing)
在創建OLE 自動化對象時必須定義實例 這樣 在創建一個OLE 自動化對象時Windows就能決定是否創建一個新的服務器實例表列出三種實例類型
表 實例的取值及含義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
instancing類型 含義
─────────────────────────────── ───────
internal OLE對象是應用程序的內部對象對象不需要注冊外部進程不能創建此對象
對象實例WIndows為第一個OLE對象創建一個服務器實例Multiple一個服務器能創建和輸出多個OLE 對象實例 進程內服務器大多是Multiple類型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
每個使用OLEAuto單元的工程文件自動地擁有一個叫Automation的對象它是非可視對象就象Application部件擁有Delphi應用程序的一些信息一樣Automation對象也擁有服務器的一些信息其中最重要的是StartMode屬性和OnLastRelease事件
StartMode指示OLE自動化服務器打開方式打開的目的表列出StartMode四種取值
表 StartMode 的取值及含義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
取值 含義
───────────────────────────────
SmStandAlone 用戶啟動應用程序
SmAutomation Windows為創建OLE對象而啟動程序
SmRegSever 應用程序僅為注冊一個或多個OLE對象而啟動
SmUnregSever 應用程序僅為注銷一個或多個OLE對象而啟動
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
當StartMode模式是SmAutomation而用戶不再需要服務器時發生OnLastRelease 事件此時所有OLE控制器釋放了由服務器創建的對象缺省情況下服務器關閉實例但OnLastRelease 事件可根據實際情況是否關閉OnLastRelease 事件可得到一個叫ShutDown的布爾型變量把ShutDown設置成True則在最後一個OLE對象釋放時服務器不關閉
無論創建何種自動化服務器必須定義對控制器的界面包括定義和注冊OLE對象OLE自動化對象的屬性和方法定義界面主要是為了控制器能夠引用它們
對已存在的自動化服務器界進行修改時要確保向上兼容 不要刪去已有的屬性方法這樣會導致已存在的自動化控制器發生錯誤修改服務器只能增加屬性和方法
創建OLE自動化服務器第一步是創建服務器自身即創建能輸出OLE 對象的應用程序或動態鏈接庫這主要取決於是創建進程內服務器還是進程外服務器
創建進程內服務器即動態鏈接庫
創建動態鏈接庫
在工程文件的uses條款中加入OLEAuto單元
在DLL中輸出四個標准入口即加入以下代碼
exports
DLLGetClassObjectDLLCanUnloadNow;
DLLRegisterServerDLLUnregisterServer;
以上代碼必須准確拼寫包括大小寫與Object Pascal的其它項目不同這些代碼
對大小寫敏感
創建進程外服務器
創建一個Delphi應用程序
在工程文件的begin之後加入以下代碼
if AutomationServer Registration then Exit;
創建服務器之後應該向服務器加入OLE自動化對象這個過程大部分是自動完成的但必須向Delphi的自動化對象專家提供必要的信息
把OLE自動化對象加入服務器
在Delphi集成開發環境中選擇File| New 菜單項 並在對象集中選擇Automation
ObjectDelphi打開自動化對象專家
給自動化對象命名
這是服務器內部標識OLE對象的名字必須是個有效的面象對象Pascal標識符習慣上以T字母開頭
給OLE類命名
該名用以外部控制器創建對象當服務器在Windows中注冊OLE對象 就以這個名字在系統注冊控制器使用這個名字調用CreateOLEObject來創建對象
描述要輸出的對象
定義對象的實例(instancing)進程內服務器常定義為Multiple進程外服務器常定義為Single;
選擇OK鍵完成該過程
自動化對象專家將產生以下代碼
● 從TAutoObject派生下來的自動化對象定義但沒有定義任何屬性方法
● 調用DelphiOLE自動化管理器的注冊代碼管理器負責Windows中注冊服務器和對象
在注冊代碼中包括一個自動產生的ID號這個ID號是全局唯一的通常不要修改每個ID號與一個OLE類名相對應如果其中之一被改變應用程序在使用時會發生錯誤
在創建了服務器並把OLE自動化對象加入服務器之後控制器程序就可以對服務器進行操縱
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25217.html