1

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」と表示されます)、クラッシュ (アクセス違反) のいずれかになります。 .

これに対する説明や修正はありますか?

編集 >> 申し訳ありませんが、実際には次のようなプロパティでのみ失敗するようです:

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

2 に答える 2

2

これは Delphi XE3 コンパイラのバグであり、XE4 で修正されています。

RAD Studio XE4 の修正リスト 104613 TVirtualInterface: インターフェイスのインデックス付きプロパティの TRttiMethod

于 2013-08-28T11:51:29.340 に答える
0

IInvokableEmbarcadero ののように、インターフェイスを継承して GUID を提供しようとしましたか?

から継承されていない場合、インターフェイス RTTI にいくつかの問題があると思いますIInvokable

于 2013-08-27T18:49:28.210 に答える