Я пытаюсь запрограммировать COM-объект с помощью Enumerable и Enumerator внутри Delphi. Это кошмар. Сначала в файле .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 отсутствует!! Большое спасибо за вашу помощь.
Мишель
tl;dr: Уберите safecall
Определение IEnumerable
:
IEnumerable = interface(IInterface)
function GetEnumerator: IEnumerator;
end;
Ваш:
function GetEnumerator: IEnumerator; safecall;
Или рядом:
function GetEnumerator: IEnumerator; // definition
function GetEnumerator: IEnumerator; safecall; // yours
У меня есть некоторые незначительные изменения, и сейчас он компилируется, но когда я вызываю следующую небольшую программу на C#,
Telescope T = new Telescope(progID);
IEnumerator enumerator;
ITrackingRates TrR = T.TrackingRates;
enumerator=TrR.GetEnumerator();
enumerator.MoveNext();
the line enumerator=TrR.GetEnumerator(); вернуть исключение из-за невозможности найти участника. Этот небольшой код отлично работает с другим объектом Telescope, написанным не мной. спасибо, Мишель