Delphi下的COM接口編程(ActiveX Library)

在較早的時候,我的博客里已經有關于COM編程的有關知識(http://hi.baidu.com/yueyun889/blog/item/53ad2c1208b6f950f919b8ee.html),不過相信對于大部分入門者,包括我,也很難看懂(其實,到現在我也沒有參透那篇文章,和我沒有認真研究有關吧...)

下面用一個具體的實例開看看如何實現的吧.

因為程序涉及ActiveX技術,那就先來看看ActiveX的用途:

ActiveX用来描述建立在COM基础上的非COM技术,它的重要内容是自动化(Automation),自动化允许一个应用程序(称为自动化控制器)操纵另一个应用程序或库(称为自动化服务器)的对象,或者把应用程序元素暴露出来.

 

程式實例部分:

: ActiveX Library,COM Object的建立:

1.選擇File – New-Other ,在彈出的”New Items” 中選擇ActiveX頁面,雙擊 ActiveX Library,出現編輯模板:

 

 

exports

DllGetClassObject,

DllCanUnloadNow,

DllRegisterServer,

DllUnregisterServer;

这四个例程并不是我们编写的,它们都在ComServ单元例实现.例程DllGetClassObject通过CLSID得到支持IClassFactory接口的对象;例程DllCanUnloadNow判断DLL是否可从内存卸载;DllRegisterServerDllUnregisterServer负责DLL的注册和解除注册,其具体的功能由ComServer实现。

2.使用同樣的方法,ActiveX頁面,選擇 COM Object.彈出如下向導: 

 

Class Name(類名,這個注意下,后面有涉及.在此填寫 Sample) 中填寫類名稱.(Instancing:實例創建方式,Threading Model:線程模式,建議使用默認選項.) 其中Implemented Interface(接口名)會根據類名自動填寫.

   點擊OK. 出現如下界面:  

 

上圖就是類型庫編輯器(Type Library).

 

 

左邊樹狀結構中,ISample 是根據我們填寫的類名得到的接口名稱.選中 ISample,點擊右鍵, 選擇 New Methord(或者上方工具欄中的綠色按鈕,上圖是灰色的.),可以創建一個方法,并給方法設置參數(在右邊的Paramters選項卡中).這里,方法名為 GetRoomInfo,并建立2個參數: RoomNo, Account,返回值 BSTR.如圖:

 

設置參數時, 双击Modifier列弹出窗口,可以选择参数的方式:inout分别对应constout定义,选择Has Default Value可设置参数缺省值。

參數類型的不同:

接口定义中缺省的字符参数或返回值将不再是String而是WideStringWideString Delphi中符合OLE 32-bit版本的Unicode类型,当是字符时,WideStringString几乎等同,当处理Unicode字符时,则会有很大差别。联想到COM本身是为了跨平台使用,可以很容易的理解为什么数据通信时需要使用WideString类型。

同样的道理,integer类型将变成SYSINT或者Int64SmallInt或者Shortint,这些细微的变化都是为了符合规范。

 

設置完成后,點擊上方的 刷新 按鈕, 類型庫編輯器自動生成delphi 代碼:

 

: 此時如果需要返回類型庫編輯器的設置,可以選擇 View- Type Library,修改設置后,點擊 刷新 按鈕. (我把原來的參數類型改了)…

unit Unit1;

 

{$WARN SYMBOL_PLATFORM OFF}

 

interface

 

uses

Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl;

 

type

TSample = class(TTypedComObject, ISample)

protected

    function GetRoomInfo(const RoomNo: WideString;

      Account: SYSINT): WideString; stdcall;

    {Declare ISample methods here}

end;

 

implementation

 

uses ComServ;

 

function TSample.GetRoomInfo(const RoomNo: WideString;

Account: SYSINT): WideString;

begin

 

end;

 

initialization

TTypedComObjectFactory.Create(ComServer, TSample, Class_Sample,

    ciMultiInstance, tmApartment);

end.

. 接口類的具體實現.

 

1.給接口類中的方法添加具體的代碼.這里為了能讓某人能看懂,寫的很簡單:

function TSample.GetRoomInfo(const RoomNo: WideString;

Account: SYSINT): WideString;

begin

if Account > 0 then

    Result := '這是單賬戶客人,房間號為: ' + RoomNo

else

    Result := '這是多賬戶客人.房間號為: ' + RoomNo ;

Result := RoomNo;//這個只是為了讓某人看懂,代碼大家可以自己寫.

end;

 

 

2.注冊創建COM對象

选择菜单“Run – Register ActiveX Server”,或者通过Windowssystem/system32目录中的regsvr32.exe程序注册编译好的DLL文件。regsvr32的具体参数可以通过regsvr32/?来获得。对于进程外(EXE型)的COM对象,执行一次应用程序就注册了。

提示DLL注册成功.

.COM對象的調用

 

新建一個Application,在窗體中放置兩個Edit,分別是用來傳遞 RoomNo,Account. 代碼如下:

implementation

uses ComObj,Project1_TLB;//這里的引用需要注意.

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

COMSvr : ISample;

begin

COMSvr := CreateComObject(CLASS_Sample) as ISample;

//也可以使用Guid 实例化

//COMSvr:=CreateComObject(StringToGuid('{330B6DA3-F7F6-49DD-B552-68769A916D66}')) as ISample;

if COMSvr <> nil then

begin

    try

      ShowMessage(COMSvr.GetRoomInfo(Edit1.Text,StrToInt(Edit2.Text)));

    finally

      COMSvr := nil;

    end;

end;

end;

end.

運行就可以看到效果了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值