TMemeDoc類是MemoEdit程序的內(nèi)部自動化類,因此不需要注冊。外部OLE自動化控制器對它不能直接引用。如果要使外部控制器對自動化對象進行操作,則要在聲明自動化對象的單元中調(diào)用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部分中對自動化對象進行注冊。 注冊的信息用以唯一辨識服務(wù)器對象。把一個自動化對象加入到服務(wù)器中要用到這些信息。程序一旦注冊了自動化對象,全局自動化對象將用OLE自動化API進行自動管理。
注冊后的OLE自動化對象是引用記數(shù)的,因為對象可能被多個控制器控制。當(dāng)使用完一個OLE對象,調(diào)用Release方法,Release可減少引用數(shù)目,當(dāng)引用數(shù)目為零時,調(diào)用Free方法釋放對象。
通常把OLE對象作為變體類型(variants)進行輸出,任何OLE 對象的方法和屬性必須返回一個包含OLE對象的變體類型,TAutoObject提供了一個變體類型的OLEObject屬性?刂破鞑荒苤苯拥玫椒⻊(wù)器中的類或指針,而是引用OLE對象的OLEObject屬性。
例程MemoAuto單元的NewMemo函數(shù)就是通過引用OLEObject 屬性而提供引用TMemoDoc對象的接口。
function TMemoApp,NewMemo : Variant;
begin
Result := MainForm,CreateMemo(' '),OleObject;
end;
8.4.2 創(chuàng)建OLE自動化服務(wù)器
OLE自動化服務(wù)器是應(yīng)用程序或動態(tài)鏈接庫(DLL),它可向OLE 自動化控制器輸出OLE對象。 MemoEditdpr 就是OLE 自動化服務(wù)器, 在MemoAuto 單元中注冊了MemoEdit.Appdication自動化類,所有OLE控制器均可對MemoEdit.Application進行引用。
在Windows環(huán)境下有兩種OLE自動化服務(wù)器,進程內(nèi)服務(wù)器和進程外服務(wù)器, Delphi可創(chuàng)建這兩種服務(wù)器。
進程內(nèi)服務(wù)器是輸出OLE自動化對象的動態(tài)鏈接庫。因為OLE自動化對象來自于DLL,
對象是控制器程序的同一窗體進程,進程內(nèi)服務(wù)器適合于創(chuàng)建共享的程序模塊, 而這個模塊可以被用不同語言編寫的多個程序所共享。 進程內(nèi)服務(wù)器被調(diào)用時在同一地址中運行,這樣就不需要控制器進行調(diào)度,以避免處理大量的消息句柄。 進程外服務(wù)器是能輸出OLE自動化對象的應(yīng)用程序。
有些OLE自動化服務(wù)器只能創(chuàng)建和輸出一個OLE對象,有些服務(wù)器則可以處理多個OLE對象,另外一些服務(wù)器不能輸出OLE對象,只能在程序內(nèi)部使用OLE對象。 服務(wù)器與其能輸出的對象數(shù)目的關(guān)系稱為實例(instancing)。
在創(chuàng)建OLE 自動化對象時必須定義實例, 這樣, 在創(chuàng)建一個OLE 自動化對象時,Windows就能決定是否創(chuàng)建一個新的服務(wù)器實例。表8.5列出三種實例類型。
表8.6 實例的取值及含義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
instancing類型 含義
─────────────────────────────── ───────
internal OLE對象是應(yīng)用程序的內(nèi)部對象,對象不需要注冊,外部進程不能創(chuàng)
建此對象
Single 每個服務(wù)器實例只能輸出一個OLE對象實例, 若控制器需要多個OLE
對象實例,WIndows為第一個OLE對象創(chuàng)建一個服務(wù)器實例
Multiple 一個服務(wù)器能創(chuàng)建和輸出多個OLE 對象實例, 進程內(nèi)服務(wù)器大多是
Multiple類型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
每個使用OLEAuto單元的工程文件自動地擁有一個叫Automation的對象,它是非可視對象。就象Application部件擁有Delphi應(yīng)用程序的一些信息一樣,Automation對象也擁有服務(wù)器的一些信息,其中最重要的是StartMode屬性和OnLastRelease事件。
StartMode指示OLE自動化服務(wù)器打開方式打開的目的。表8.7列出StartMode四種取值。
表8.7 StartMode 的取值及含義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
取值 含義
───────────────────────────────
SmStandAlone 用戶啟動應(yīng)用程序
SmAutomation Windows為創(chuàng)建OLE對象而啟動程序
SmRegSever 應(yīng)用程序僅為注冊一個或多個OLE對象而啟動
SmUnregSever 應(yīng)用程序僅為注銷一個或多個OLE對象而啟動
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
當(dāng)StartMode模式是SmAutomation,而用戶不再需要服務(wù)器時發(fā)生OnLastRelease 事件。此時所有OLE控制器釋放了由服務(wù)器創(chuàng)建的對象。缺省情況下,服務(wù)器關(guān)閉實例,但OnLastRelease 事件可根據(jù)實際情況是否關(guān)閉。OnLastRelease 事件可得到一個叫ShutDown的布爾型變量。把ShutDown設(shè)置成True,則在最后一個OLE對象釋放時服務(wù)器不關(guān)閉。
無論創(chuàng)建何種自動化服務(wù)器,必須定義對控制器的界面,包括定義和注冊O(shè)LE對象,OLE自動化對象的屬性和方法。定義界面主要是為了控制器能夠引用它們。
對已存在的自動化服務(wù)器界進行修改時,要確保向上兼容 ,不要刪去已有的屬性、方法,這樣會導(dǎo)致已存在的自動化控制器發(fā)生錯誤,修改服務(wù)器只能增加屬性和方法。
創(chuàng)建OLE自動化服務(wù)器第一步是創(chuàng)建服務(wù)器自身。即創(chuàng)建能輸出OLE 對象的應(yīng)用程序或動態(tài)鏈接庫。這主要取決于是創(chuàng)建進程內(nèi)服務(wù)器還是進程外服務(wù)器。
創(chuàng)建進程內(nèi)服務(wù)器,即動態(tài)鏈接庫:
1.創(chuàng)建動態(tài)鏈接庫;
2.在工程文件的uses條款中加入OLEAuto單元;
3.在DLL中輸出四個標準入口,即加入以下代碼。
exports
DLLGetClassObject,DLLCanUnloadNow;
DLLRegisterServer,DLLUnregisterServer;
以上代碼必須準確拼寫,包括大小寫。與Object Pascal的其它項目不同,這些代碼
對大小寫敏感。
創(chuàng)建進程外服務(wù)器:
1.創(chuàng)建一個Delphi應(yīng)用程序;
2.在工程文件的begin之后加入以下代碼;
if Automation,Server Registration then Exit;
創(chuàng)建服務(wù)器之后,應(yīng)該向服務(wù)器加入OLE自動化對象,這個過程大部分是自動完成的,但必須向Delphi的自動化對象專家提供必要的信息。
把OLE自動化對象加入服務(wù)器:
1.在Delphi集成開發(fā)環(huán)境中選擇File| New 菜單項, 并在對象集中選擇Automation
Object,Delphi打開自動化對象專家。
2.給自動化對象命名
這是服務(wù)器內(nèi)部標識OLE對象的名字,必須是個有效的面象對象Pascal標識符,習(xí)慣上以T字母開頭;
3.給OLE類命名
該名用以外部控制器創(chuàng)建對象。當(dāng)服務(wù)器在Windows中注冊O(shè)LE對象, 就以這個名字在系統(tǒng)注冊。控制器使用這個名字調(diào)用CreateOLEObject來創(chuàng)建對象。
4.描述要輸出的對象。
5.定義對象的實例(instancing),進程內(nèi)服務(wù)器常定義為Multiple,進程外服務(wù)器常定義為Single;
6.選擇OK鍵完成該過程
自動化對象專家將產(chǎn)生以下代碼:
● 從TAutoObject派生下來的自動化對象定義,但沒有定義任何屬性方法;
● 調(diào)用DelphiOLE自動化管理器的注冊代碼,管理器負責(zé)Windows中注冊服務(wù)器和對象。
在注冊代碼中包括一個自動產(chǎn)生的ID號,這個ID號是全局唯一的,通常不要修改。每個ID號與一個OLE類名相對應(yīng),如果其中之一被改變,應(yīng)用程序在使用時會發(fā)生錯誤。
在創(chuàng)建了服務(wù)器并把OLE自動化對象加入服務(wù)器之后,控制器程序就可以對服務(wù)器進行操縱。
8.4.3 自動化另一程序
每個服務(wù)器在系統(tǒng)注冊中有一個叫ProgID的關(guān)鍵定,主要用以控制器辨識服務(wù)器。任何控制器可以用ProgID號來創(chuàng)建OLE對象實例。例程AutoForm是控制器程序,它在其主窗體創(chuàng)建了OLE對象實例。
procedure TMainForm.FormCreate(Sender : TObject);
begin
try
MemoEdit := CreateOleObject('MemoEdit.Application');
except
MessageDlg(
'An instance of the "MemoEdit Application"OLE Automation Class could
not be created,Make sure that the MemoEdit application has been registered
using a "MemoEdit|regserver"command line',
mtError,[mbok],0)
Halt;
end;
end;
控制器創(chuàng)建了OLE自動化對象實例后,可對其進行操縱。OLE自動對象包括屬性和方法,雖然OLE自動化對象與面向?qū)ο驪ascal中的對象不是同一概念,但Delphi允許使用與類似的語法對OLE對象的方法進行調(diào)用。
AutoForm的很多過程引用了OLE自動化對象的方法:
procedure TMainForm,TileButtonClick(Sender : Tobject);
begin
MemoEdit,TileWindow;
end;
其中TileWindows是OLE對象TMemoApp中定義的方法。
AutoForm還通過TMemoApp的NewMemo方法獲得了對服務(wù)器內(nèi)部OLE對象TMemoDoc 的引用。
procedure TMainForm,CreateButtonClick(Sender : TObject);
var
I : Integer;
begin
CloseMemo
for I := 1 to 3 do Memos[2] := MemoEdit.NewMemo;
end;
其中NewMemo在MemoAuto單元中定義如下:
function IMemoApp.NewMemo : Variant;
begin
Result := MainForm,CreateMemo(' '),OleObject;
end;
控制器在獲得服務(wù)器的內(nèi)部OLE對象后,可以引用其方法:
procedure TMainForm.AddTextButtonClick(Sender,TObject);
var
I : Integer;
begin
for I := 1 to 3 do
if not var IsEmpty(Memo[I]) then
Memo[I],Insert{'This text was added through OLE Automation'#13#10);
end;
Insert是TMemoDoc中定義的方法,用以在子窗體中插入字符串。
相關(guān)推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |