2013-02-21 11 views
15

私は、このテストプログラムインターフェイスを持つhttps://gist.github.com/real-mielofon/5002732インターフェイスのsafecall関数メソッドでRTTI-callを作成するにはどうすればよいですか?

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. 

をし、それが手続きであるかそうでない場合、私は

result := aI+1; 

にKABOOMを持っていますsafecall、それでいいよ.--(

答えて

5

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

+0

私は ":HRESULT; stdcall"について知っていますが、現在入手可能な唯一の解決策は、ソースからsafecallを削除することです(と私はそれをやっています)が、RTTIで作業するにはどうすれば解決できるのでしょうか? – Mielofon

+0

私はあなたがインターフェイスの宣言を変更する必要はないと思う。 RTTIで呼び出したときに2つのパラメータを渡し、その呼び出しの戻り値としてHRESULTを読み込みます。 –

+0

カウントパラメータを変更すると、例外の結果が返されます。 パラメータの数が一致しません。 約: RttiHResultValue:= RttiMethod.Invoke(RttiInstance、[10、RttiReturnValue]); – Mielofon

関連する問題