TVirtualInterface调用错误的invoke事件

时间:2013-08-27 14:17:00

标签: delphi delphi-xe3

我注意到TVirtualInterface类有一个奇怪的错误。 我试过以下的事情:

ITest1 = interface
  procedure Test1();
End;

ITest2 = Interface(ITest1)
  procedure Test2();
End;

ITest3 = Interface(ITest2)
  procedure Test3();
ENd;

procedure Test();
var 
    test : ITest3;
begin
    test := TVirtualInterface(TypeInfo(ITest3),
        procedure(Method: TRttiMethod;
            const Args: TArray<TValue>; out Result: TValue)
        begin
            showMessage(Method.Name);
        end) as ITest3;

    test.test1();
    test.test2();
    test.test3();
End;

上面的代码运行正常。如果我改变它:

ITest3 = Interface(ITest2)
  procedure Test3();
  function GetLabel : string;
  property Label : string read GetLabel;
ENd;

我打电话:

showmessage(test.Label);

......它仍然有效。

但是如果我将此属性移动到ITest2或ITest1,调用任何ITest1,ITest2或ITest3的方法将调用错误的方法(例如test.Test2()将显示“Test3”),要么崩溃(访问违规)。

对此有何解释和/或解决方法?

修改&gt;&gt;对不起,实际上它实际上似乎只有这种属性失败:

property Item[Name : string] : X read GetX write SetX;

2 个答案:

答案 0 :(得分:2)

这是Delphi XE3编译器中的错误,它已在XE4中修复

Fix list for RAD Studio XE4 104613 TVirtualInterface:接口中索引属性的TRttiMethod

答案 1 :(得分:0)

您是否尝试从IInvokable继承接口,并为其提供GUID,如Embarcadero example

我猜是接口RTTI存在一些问题,如果它不是从IInvokable继承的