自動化是從一個應用程序內部自動控制另一個應用程序的方法
例如下面的代碼
procedure CreateNewWord;
var
WordObj: Variant;
begin
WordObj := CreateOleObject(
Word
Basic
); {此函數聲明於ComObj單元}
WordObj
AppShow;
WordObj
FileNew;
end;
這段代碼將會打開WORD
並自動建立一個新的文檔(當然前提是你的機子上安裝了WORD)
這看來很有趣
也是一種非常有用的功能
那麼如何讓我們的程序也擁有類似WORD等的自動化功能並能讓其它任何語言開發的程序對我們的程序進行自動化呢?用DELPHI來實現非常簡單
這篇文章將會以實例形式一步步的來說明如何開發一個簡單的自動化服務器
新建一個普通的應用程序將工程保存為AutoSrvbpr在主窗體上放一個Edit控件並保存為MainFormpas在這裡我們打算給這個程序加上對窗口標題窗體顏色和Edit控件文本的自動化控制(當然這實現的功能很少但對於講解如何開發自動化服務器程序足夠了)在主窗口中加入如下代碼:(注意:請自行將這些函數和過程的聲明加入TForm的public區)
function TFormGetCaption: string;
begin
result := SelfCaption;
end;
procedure TFormSetCaption(ACaption: string);
begin
SelfCaption := ACaption;
end;
procedure TFormSetColor(AColor: TColor);
begin
SelfColor := AColor;
end;
procedure TFormSetEditText(AText: string);
begin
SelfEditText := AText;
end;
然後我們來給這個程序加上自動化的功能點擊New Items按鈕在彈出的New Items窗口中點擊ActiveX選項卡選擇Automation Object點擊OK按鈕在彈出的Automation Object Wizard窗口中CoClass Name一項中輸入MyAutoSrv Delphi就會自動生成一個AutoSrv_TLBpas文件(類庫)和實現類庫接口類的單元將這個新的單元保存為AutoSrvClasspas.
現在這個程序已經成為一個自動化服務器了我們再來為其加上自動化的接口函數:
()點擊View>Type Libray菜單在Type Library Editor選擇IMyAutoSrv接口點擊New Property選擇其屬性為Read|Write並把其命名為CaptionType設定為BSTR
()點擊New Method將其命名為SetColor點擊右邊的Parameters選項卡點擊ADD為新添的接口函數添加一個參數將參數名設為AColor參數Type設為OLE_COLOR
()再次點擊New Method將其命名為SetEditText以上面的方法為其添加一個參數將參數名設為AText參數Type設為BSTR
最後添加上接口函數的實現代碼就OK了:
在AutoSrvClasspas的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 TMyAutoSrvGet_Caption: WideString;
begin
Result := FormGetCaption;
end;
procedure TMyAutoSrvSet_Caption(const Value: WideString);
begin
FormSetCaption(Value);
end;
procedure TMyAutoSrvSetColor(AColor: OLE_COLOR);
begin
FormSetColor(AColor);
end;
procedure TMyAutoSrvSetEditText(const AText: WideString);
begin
FormSetEditText(AText);
end;
initialization
TAutoObjectFactoryCreate(ComServer TMyAutoSrv Class_MyAutoSrv
ciMultiInstance tmApartment);
end
運行這個程序一次將會自動注冊為自動化服務器可以在注冊表中的HKEY_CLASSES_ROOT主鍵下面找到其相關的注冊信息
上面演示了如何開發一個自動化服務器在這裡我們將調用它
新建一個程序添加一個Button在其VAR區聲明一個Variant變量: AutoSrv: variant
再在Button中添加如下代碼
procedure TFormButtonClick(Sender: TObject);
begin
AutoSrv := CreateOleObject(AutoSrvMyAutoSrv); {這個字符串就是自動化服務器的工程名加上CoClass Name}
SelfCaption := AutoSrvCaption;
AutoSrvCaption := HEHE;
AutoSrvSetColor(CLRed);
AutoSrvSetEditText(HAHA);
end;
其中的CreateOleObject函數將會返回一個IDispatch類型的接口正是IDispatch接口讓我們的程序可以對自動化服務器接口的調用進行後期連接比如我們在上面添加一句AutoSrvHello程序也能被編釋通過但在執行時就會出錯 使用Variant在執行效率上會比直接使用接口聲明要慢一些
運行並點擊按鈕可以看到自動化服務程序被加載並按我們的代碼設置了窗體色和EDIT中的字串呵呵是不是很簡單啊?
用其它語言也可以調用這個自動化服務器比如VCVB或包含腳本的網頁例如網絡螞蟻也是實現為自動化服務器來取得點擊的網址地址
From:http://tw.wingwit.com/Article/program/Delphi/201311/24993.html