在Delphi 2010 RIDL编辑器中定义类型函数/过程指针的属性

时间:2016-08-14 18:16:21

标签: delphi com delphi-2010 idl

我想知道是否可以在Delphi 2010 RIDL编辑器中定义类型函数/过程指针的属性,用于接口定义,这样当我使用其CoCreator创建其实现者的实例时,我可能会分配一个函数我的源中的/ procedure使用该接口定义到该属性。其实我想知道如何填补" ??? "以下。

TLB文件:

IComIntf = interface(IDispatch)
...
  function Get_OnDoSomething : ??? safecall;
  procedure Set_OnDoSomething(const New_Event : ???); safecall;
...
  property OnDoSomething : ???;
...
implementation

uses ComObj;

class function CoComIntf.Create: IComInt;
...
begin
  Result := CreateComObject(CLASS_ComIntf) as IComIntf;
end;

实施文件,ComIntfUnit.pas:

type
  TOnDoSomething = function (Info: OleVariant): HResult of object;

TComIntf = class(TAutoObject, IComIntf)
private
  fOnDoSomething : TDoSomething;
...
public
  property OnDoSomething: TOnDoSomething read fOnDoSomething write fOnDoSomething;
...

客户表格:

uses ComIntfUnit;

type
  TForm1 = class(TForm)
  private
  { Private declarations }
    fCom : IComIntf;
    function DoSomething(Info: OleVariant): HResult;
  public
  { Public declarations }
...
  end;
...

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  fCom := CoComIntf.Create;
  fCom.OnDoSomething := DoSomething;
...

提前谢谢。

1 个答案:

答案 0 :(得分:0)

你这是错误的方式。实现此目的的正确方法是定义客户端实现并传递给COM对象的第二个接口。然后,COM对象可以保留该接口,并在需要时调用其上的方法。这通常是使用Connection Points为事件接口实现的。

实现此目的的一种简单方法,特别是在您使用IDispatch时,是使用IDE向导创建新的自动化对象,并确保单击“生成事件”支持代码“向导对话框中的复选框。然后,向导将生成2个接口,一个用于对象本身,另一个用于对象的事件,并为您实现连接点逻辑。然后,您可以根据需要向2个接口添加方法,其中对象方法在需要时调用事件方法。

如果您随后编译,注册并将最终对象导入IDE并为其生成VCL包装器,则生成的组件将在其上具有VCL样式的事件,这些事件内部连接到对象的连接点事件。 / p>