如何使用 IEnumerator、IEnumerable 接口编写 COM 对象

问题描述 投票:0回答:1

我正在尝试用 Delphi 中的 Enumerable 和 Enumerator 编写一个 COM 对象。这是一场噩梦。 首先在 .ridl 文件中: 接下来在 _tlb.pas 中我有这个:

// *********************************************************************//
// Interface :   ITrackingRatesCol
// Indicateurs : (4416) Dual OleAutomation Dispatchable
// GUID :        {F116E1DA-7E3E-4207-BD17-1615DCE4BE41}
// *********************************************************************//
  ITrackingRatesCol = interface(IEnumerable)
    ['{F116E1DA-7E3E-4207-BD17-1615DCE4BE41}']
    function Get_Count: Integer; safecall;
    property Count: Integer read Get_Count;
  end;

// *********************************************************************//
// DispIntf :    ITrackingRatesColDisp
// Indicateurs : (4416) Dual OleAutomation Dispatchable
// GUID :        {F116E1DA-7E3E-4207-BD17-1615DCE4BE41}
// *********************************************************************//
  ITrackingRatesColDisp = dispinterface
    ['{F116E1DA-7E3E-4207-BD17-1615DCE4BE41}']
    property Count: Integer readonly dispid 1;
    function GetEnumerator: IEnumVARIANT; dispid -4;
  end;

在我的对象的 .pas 文件中:

  TTrackingRatesCol = class(TAutoObject, ITrackingRatesCol,IEnumerable)
   private
      fIndex,fCount:integer;
  protected
    function GetCurrent:driverates;safecall;
    function Get_Count: Integer; safecall;
    function MoveNext: WordBool; safecall;
    function GetEnumerator: IEnumerator; safecall;
   public
      procedure Initialize; override;
      destructor Destroy; override;
  end;

implementation

uses ComServ,Data.Win.ADODB,Core,SysUtils;

function TTrackingRatesCol.GetEnumerator: IEnumerator;
begin
  result:=self;
end;

但我总是收到这样的消息:缺少 IEnumerable.GetEnumerator 接口的实现! 非常感谢您的帮助。

米歇尔

delphi com
1个回答
0
投票

tl;博士:删除

safecall

IEnumerable
的定义:

  IEnumerable = interface(IInterface)
    function GetEnumerator: IEnumerator;
  end;

你的:

function GetEnumerator: IEnumerator; safecall;

或者并排:

function GetEnumerator: IEnumerator;             // definition
function GetEnumerator: IEnumerator; safecall;   // yours
© www.soinside.com 2019 - 2024. All rights reserved.