将对象作为OleVariant传递

时间:2015-09-05 17:47:18

标签: delphi interface com

我的课程TRate来自IDispatchTAutoObject

Type
  IRate = interface(IDispatch)
  ['{60B5A5D1-5BA9-4D28-BBF9-DD5BE2B83ED2}']
  function Get_Minimum: Double; safecall;
  procedure Set_Minimum(Value: Double); safecall;
  function Get_Maximum: Double; safecall;
  procedure Set_Maximum(Value: Double); safecall;
  property Minimum: Double read Get_Minimum write Set_Minimum;
  property Maximum: Double read Get_Maximum write Set_Maximum;
end;

TRate = class(TAutoObject, IRate)
protected
  function Get_Maximum: Double; safecall;
  function Get_Minimum: Double; safecall;
  procedure Set_Maximum(Value: Double); safecall;
  procedure Set_Minimum(Value: Double); safecall;
public
  fMaximum,fMinimum:double;
  destructor Destroy; override;
end;


//INSIDE mscorlib_tlb.pas
// *********************************************************************//
// Interface :   IEnumerator
// Indicateurs : (4416) Dual OleAutomation Dispatchable
// GUID :        {496B0ABF-CDEE-11D3-88E8-00902754C43A}  
// *********************************************************************//
IEnumerator = interface(IDispatch)
['{496B0ABF-CDEE-11D3-88E8-00902754C43A}']
  function MoveNext: WordBool; safecall;
  function Get_Current: OleVariant; safecall;
  procedure Reset; safecall;
  property Current: OleVariant read Get_Current;
end;

TRateEnum = class(TAutoObject, IEnumerator)
protected
  function Get_Current: OleVariant; safecall;
  function MoveNext: WordBool; safecall;
  procedure Reset; safecall;
public
  fAxe,fCount,fIndex:integer;
end;

我有g_RateTRate类型的对象数组。我必须通过g_Rate访问IEnumerator个成员。 IEnumerator中的标准功能为Get_Current,看起来像那样(返回OleVariant):

Type
  g_Rate:Array [0..2,0..2] of TRate;
end

function TRateEnum.Get_Current: OleVariant;
begin
  result:= g_Rate[i,j];
end;

我收到编译错误,“输入mismatch,Olevariant TRate”,我该如何避免这个问题? 此致

1 个答案:

答案 0 :(得分:0)

您正在实现一个返回COM变体的COM方法。 OleVariant类型用于表示COM变体。来自documentation

  

OleVariant是一个与OLE兼容的Variant。 Variant和OleVariant之间的主要区别在于Variant可以包含只有当前应用程序知道如何处理的数据类型。 OleVariant只能包含定义为与OLE Automation兼容的数据类型,这意味着包含的数据类型可以在程序之间或通过网络传递,而不必担心另一端是否知道如何处理数据。

您正在尝试将Delphi类放入OleVariant,并且因为Delphi类不是自动化类型而被阻止。相反,您需要将自动化界面放入您返回的OleVariant中:

function TRateEnum.Get_Current: OleVariant;
begin 
  Result := g_Rate[i,j] as IRate; 
end;