• Delphi COM接口編程(ActiveX 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.

    運行就可以看到效果了.

  • 相关阅读:
    C# 两个List泛型用lamada表达式去重复数据 或者 得到重复数据
    基于模版文件复制替换的abpcore代码生成器(一)
    基于数据库的vs2019的T4模版代码生成器(二)基于mysql数据库
    基于数据库的vs2019的T4模版代码生成器(一)基于sqlserver数据库
    前后端分离开发vue+Elementyui+abpcorewebapi商城管理系统(十六)项目总结
    前后端分离开发vue+Elementyui+abpcorewebapi商城管理系统(十五)项目上线
    前后端分离开发vue+Elementyui+abpcorewebapi商城管理系统(十四)项目优化
    前后端分离开发vue+Elementyui+abpcorewebapi商城管理系统(十三)报表开发
    前后端分离开发vue+Elementyui+abpcorewebapi商城管理系统(十二)订单列表页面
    前后端分离开发vue+Elementyui+abpcorewebapi商城管理系统(十一)之二 添加商品页面
  • 原文地址:https://www.cnblogs.com/fengju/p/6173887.html
Copyright © 2020-2023  润新知