熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:對象鏈接與嵌入(二)[3]

2022-06-13   來源: Delphi編程 

  注冊後的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
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.