15

私はこのテストプログラムを持っています https://gist.github.com/real-mielofon/5002732

  RttiValue := RttiMethod.Invoke(RttiInstance, [10]);

インターフェイスを備えたシンプルなユニット:

unit Unit163;

interface

type
{$M+}
  ISafeIntf = interface
    function TestMethod(aI: integer): integer; safecall;
  end;
{$M-}
 type
   TSafeClass = class(TInterfacedObject, ISafeIntf)
   public
     function TestMethod(aI: integer): integer; safecall;
   end;

implementation

function TSafeClass.TestMethod(aI: integer): integer;
begin
  result := aI+1; // Exception !!
end;

end.

そして私はkaboomを持っています

result := aI+1;

それがプロシージャであるか、セーフコールでない場合は、大丈夫です:-(

4

1 に答える 1

5

これを自分で試し、コードを調べた結果、バグがあるという結論に達しました。RTTI ユニットは実際にsafecallメソッドの書き換えを実行しようとします。間違っているように見えるだけです。プロジェクトを QC レポートとして提出し、戻り値を使用stdcallして問題を回避することをお勧めします。HRESULT

于 2013-02-21T07:32:44.600 に答える