自動化是從一個應用程式內部自動控制另一個應用程式的方法,例如下面的程式碼.
PRocedure CreateNewWord;
var
WordObj: Variant;
begin
WordObj := CreateOleObject('Word.Basic'); {此函數宣告於ComObj單元}
WordObj.AppShow;
WordObj.FileNew;
end;
這段程式碼將會打開WORD,並自動建立一個新的文檔(當然前提是你的機子上安裝了WORD),這看來很有趣,也是一種非常有用的功能.那麼如何讓我們的程式也擁有類似WORD等的自動化功能並能讓其它任何語言開發的程式對我們的程式進行自動化呢?用DELPHI來實現非常簡單.
這篇文章將會以實例形式一步步的來說明如何開發一個簡單的自動化伺服器.
新建一個普通的應用程式,將工程保存為AutoSrv.bpr.在主窗體上放一個Edit控制項,並保存為MainForm.pas,在這裡我們打算給這個程式加上對視窗標題,窗體顏色,和Edit控製文字的自動化控制(當然這實現的功能很少,但對於講解如何開發自動化伺服器程式足夠了),在主視窗中加入如下程式碼:(注意:請自行將這些函數和流程的宣告加入TForm1的public區)
function TForm1.GetCaption: string;
begin
result := Self.Caption;
end;
procedure TForm1.SetCaption(ACaption: string);
begin
Self.Caption := ACaption;
end;
procedure TForm1.SetColor(AColor: TColor);
begin
Self.Color := AColor;
end;
procedure TForm1.SetEditText(AText: string);
begin
Self.Edit1.Text := AText;
end;
然後我們來為這個程式加上自動化的功能,點擊New Items按鈕,在彈出的New Items視窗中點擊ActiveX選項卡,選擇Automation Object點擊OK按鈕,在彈出的Automation Object Wizard視窗中CoClass Name一項中輸入MyAutoSrv, Delphi就會自動產生一個AutoSrv_TLB.pas檔案(類別庫)和實作類別庫介面類別的單元,將這個新的單元保存為AutoSrvClass.pas
現在這個程式已經成為一個自動化伺服器了,我們再來為其加上自動化的介面函數:
(1)點選View->Type Libray選單,在Type Library Editor選擇IMyAutoSrv介面,點選New Property,選擇其屬性為Read|Write,並將其命名為Caption,Type設定為BSTR.
(2)點選New Method,將其命名為SetColor,點選右邊的Parameters標籤,點選ADD為新添的介面函數新增一個參數,將參數名稱設為AColor,參數Type設為OLE_COLOR.
(3)再次點選New Method,將其命名為SetEditText,以上面的方法為其新增一個參數,將參數名稱設為AText,參數Type設為BSTR.
最後加入上介面函數的實作程式碼就OK了:
在AutoSrvClass.pas的Uses部分添加上MainForm,並將其程式碼改為如下程式碼.
unit AutoSrvClass;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, AutoSrv_TLB, StdVcl, MainForm;
type
TMyAutoSrv = class(TAutoObject, IMyAutoSrv)
protected
function Get_Caption: WideString; safecall;
procedure Set_Caption(const Value: WideString); safecall;
procedure SetColor(AColor: OLE_COLOR); safecall;
procedure SetEditText(const AText: WideString); safecall;
end;
implementation
uses ComServ;
function TMyAutoSrv.Get_Caption: WideString;
begin
Result := Form1.GetCaption;
end;
procedure TMyAutoSrv.Set_Caption(const Value: WideString);
begin
Form1.SetCaption(Value);
end;
procedure TMyAutoSrv.SetColor(AColor: OLE_COLOR);
begin
Form1.SetColor(AColor);
end;
procedure TMyAutoSrv.SetEditText(const AText: WideString);
begin
Form1.SetEditText(AText);
end;
initialization
TAutoObjectFactory.Create(ComServer, TMyAutoSrv, Class_MyAutoSrv,
ciMultiInstance, tmApartment);
end.
執行這個程式一次,將會自動註冊為自動化伺服器.可以在註冊表中的HKEY_CLASSES_ROOT主鍵下面找到其相關的註冊資訊.
上面示範如何開發一個自動化伺服器,在這裡我們將呼叫它.
新建一個程式,新增一個Button,在其VAR區宣告一個Variant變數: AutoSrv: variant
再在Button1中加入如下程式碼.
procedure TForm1.Button1Click(Sender: TObject);
begin
AutoSrv := CreateOleObject('AutoSrv.MyAutoSrv'); {這個字串就是自動化伺服器的工程名稱加上CoClass Name}
Self.Caption := AutoSrv.Caption;
AutoSrv.Caption := 'HEHE';
AutoSrv.SetColor(CLRed);
AutoSrv.SetEditText('HAHA');
end;
其中的CreateOleObject函數將會傳回一個IDispatch類型的介面,正是IDispatch介面讓我們的程式可以對自動化伺服器介面的呼叫進行後期連接,例如我們在上面新增一句AutoSrv.Hello,程式也能被編釋通過,但在執行時就會出錯. 使用Variant在執行效率上會比直接使用介面聲明慢一些.
運行並點擊按鈕,可以看到自動化服務程序被加載,並按我們的代碼設定了窗體色和EDIT1中的字符串,呵呵,是不是很簡單啊?