2013-02-21 7 views
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. 

और मैं

result := aI+1; 

पर kaboom अगर यह प्रक्रिया है या नहीं सुरक्षित, तो यह ठीक है :-(

उत्तर

5

अब यह कोशिश करने के बाद, और कोड को देखा, मेरा निष्कर्ष यह है कि एक बग है। आरटीटीआई इकाई वास्तव में safecall विधि पुनः लिखने का प्रयास करती है। ऐसा लगता है कि यह गलत है। मैं अनुशंसा करता हूं कि आप अपनी परियोजना को क्यूसी रिपोर्ट के रूप में सबमिट करें, और stdcall का उपयोग करके HRESULT वापसी मूल्यों के साथ समस्या का समाधान करें।

+0

मुझे ": HRESULT; stdcall" के बारे में पता है और आज उपलब्ध एकमात्र समाधान स्रोत से सुरक्षित है (और मैं इसे कर रहा हूं), लेकिन हो सकता है कि आरटीटीआई के साथ काम करने का कोई समाधान हो? – Mielofon

+0

मुझे नहीं लगता कि आपको इंटरफ़ेस में घोषणा को बदलने की आवश्यकता है। जब आप आरटीटीआई के माध्यम से इसे कॉल करते हैं तो बस दो पैरामीटर पास करें और उस कॉल के रिटर्न वैल्यू के रूप में HRESULT में पढ़ें। –

+0

यदि मैं गिनती पैरामीटर बदलता हूं, तो मेरे पास परिणामस्वरूप अपवाद है: पैरामीटर गिनती मेल नहीं खाता है। यह लगभग है: RttiHResultValue: = RttiMethod.Invoke (RttiInstance, [10, RttiReturnValue]); – Mielofon

संबंधित मुद्दे