2013-02-21 43 views
15

我有此測試程序https://gist.github.com/real-mielofon/5002732如何使用接口的safecall函數方法進行RTTI調用?

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

現在自己試了一下,看了看代碼,我的結論是有一個bug。 RTTI單元確實嘗試執行safecall方法重寫。它似乎錯了。我建議您提交項目作爲QC報告,並使用stdcallHRESULT返回值來解決問題。

+0

我知道關於「:HRESULT; stdcall」,今天唯一可用的解決方案是從源代碼刪除safecall(而且我這樣做),但也許有一個解決方案如何與RTTI合作? – Mielofon 2013-02-21 11:00:29

+0

我不認爲你需要改變界面中的聲明。當您通過RTTI調用它時只需傳遞兩個參數,並將HRESULT作爲該調用的返回值讀取。 – 2013-02-21 11:05:57

+0

如果我更改計數參數,則結果中有異常: 參數計數不匹配。 它是關於: RttiHResultValue:= RttiMethod.Invoke(RttiInstance,[10,RttiReturnValue]); – Mielofon 2013-02-21 11:18:21