8.4 OLE自動化
OLE自動化是Windows應用程序操縱另一個程序的一種機制。OLE 2.0提供了一種方法來集成應用程序,這就是應用程序之間的命令操作。
利用OLE 2.0,程序員可以定義一組命令,使它們進入到其它程序中。這些命令可帶參數。看起來很象應用程序在調用函數或過程一樣。采用上述辦法, 可以在人不參與的情況下,就能使得兩個應用程序的相互作用。
被自動化的程序稱作自動化對象或自動化服務器, 操作或自動化其他程序的應用程序稱為自動化控制器或自動化客戶器。
Delphi2.0完全支持OLE2.0的應用程序自動化,可以用Delphi 2.0編寫自動化控制器和服務
器。在應用程序之間可編程的潛能是巨大的。用戶可以創建宏或者其它命令, 使得某個應用程序能透過其它應用程序進行工作。已經存在的應用程序的宏語言很容易被擴展,它可以包括一組別的應用程序能夠執行的命令和函數調用。
現在介紹兩個應用程序,其中MemoEdit.dpr 是多文檔界面的文本編輯器,作為OLE自動化服務器,AutoFrom.dpr是自動化控制器。運行AutoForm前,在Delphi集成開發環境中單擊菜單(run | parameters),Delphi彈出運行參數對話框,如圖8.5,輸入參數後運行狀態如圖8.6。AutoForm窗體的多個按鈕。可對MemoEdit進行操作;如按Creat按鈕,MemoEdit產生三個子窗體,如圖8.7,按"AddText",子窗體將出現"This text was added through OLE Automation"的字符串“
MemoEdit包括三個單元:
Mainfrom MDI主窗體
EditFrom MDE子窗體和自動化類
MemoAuto 應用程序自動化對象
下面結合例程講述OLE自動化的基本概念及開發。
8.4.1 TAutoObject對象
TAutoObject 是Delphi自動化服務器中所有對象的基類,任何自動化對象都是從TAutoObject類派生出來的。
OLE對象的定義與其它類的定義類似。它的automated部分象普通類的public部分,OLE控制器可引用在這部分聲明的屬性和方法。編譯器把automated部分創建成OLE自動化對象的入口。但automated部分的代碼有很多限制:
● 屬性方法可以定義,但不能定義域;
● 所有屬性、參數、函數類型必須是以下類型之一:
SmallInt,Integer,Single,Double,Currency,TDateTime,String,WordBool, Varint
● 屬性聲明只能包括訪問定義符(read and Write),其它定義符如index,stored,
default,odefault均不能使用;
● 訪問定義符必須列出相應的方法標識符,不能使用域標識符;
● 支持數組類型;
● 不允許屬性重載;
● 方法是可以是虛擬的,但不能是動態的,允許方法重載。
在EditFrom單元中定義了TMemoDoc類:
type
TMemoDoc = Class(TAutoObject)
private
FEditForm : TEditForm;
funtion CretFileName : String;
funtion CretModiFied : WordBool;
procedure SetFileName(Const Value : String);
automated
procedure Clear;
procedure Ineart(Const Text : String);
procedure Save;
procedure Close;
procedure FileName : String read GretFileName write
SetFileName;
procedure Modified : WordBool read GretModified
end;
TMemeDoc類是MemoEdit程序的內部自動化類,因此不需要注冊。外部OLE自動化控制器對它不能直接引用。如果要使外部控制器對自動化對象進行操作,則要在聲明自動化對象的單元中調用Automation. RegisterClass 進行注冊。例程MemoAuto 單元定義了TMemoApp對象並進行注冊。
unit MemoAuto
…
type
TMemoApp = Class(TAutoObject)
implementation
…
procedure RegisterMemoApp
Const
AutoClassInfo : TAutoClassInfo = (
AutoClass : TMemoApp;
ProgID : MemoEdit,Application
ClassIn : '{FIFF4880 - 200D - 11CF - BDCF - D020AFOE5B81}';
Description : 'Memo Editor Application';
Instancing : acSingle Instance );
begin
Automation,RegisterClass(AutoClassInfo)
end;
inibialization
RegisterMemoApp;
end;
自動化對象要在initialization部分中對自動化對象進行注冊。 注冊的信息用以唯一辨識服務器對象。把一個自動化對象加入到服務器中要用到這些信息。程序一旦注冊了自動化對象,全局自動化對象將用OLE自動化API進行自動管理。
注冊後的OLE自動化對象是引用記數的,因為對象可能被多個控制器控制。當使用完一個OLE對象,調用Release方法,Release可減少引用數目,當引用數目為零時,調用Free方法釋放對象。
通常把OLE對象作為變體類型(variants)進行輸出,任何OLE 對象的方法和屬性必須返回一個包含OLE對象的變體類型,TAutoObject提供了一個變體類型的OLEObject屬性。控制器不能直接得到服務器中的類或指針,而是引用OLE對象的OLEObject屬性。
例程MemoAuto單元的NewMemo函數就是通過引用OLEObject 屬性而提供引用TMemoDoc對象的接口。
function TMemoApp,NewMemo : Variant;
begin
Result := MainForm,CreateMemo(' '),OleObject;
end;