2013-02-21 28 views
15

tôi có chương trình thử nghiệm này https://gist.github.com/real-mielofon/5002732Làm cách nào để thực hiện cuộc gọi RTTI với phương thức chức năng safecall của giao diện?

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

và đơn vị đơn giản với giao diện:

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. 

và tôi có kaboom trên

result := aI+1; 

nếu nó là thủ tục hay không là safecall, thì được rồi :-(

Trả lời

5

Bây giờ đã tự mình thử, và nhìn vào mã, kết luận của tôi là có một lỗi. Đơn vị RTTI thực sự cố gắng thực hiện viết lại phương thức safecall. Nó chỉ xuất hiện để làm cho nó sai. Tôi khuyên bạn nên gửi dự án của mình dưới dạng báo cáo QC và giải quyết sự cố bằng cách sử dụng stdcall với giá trị trả về HRESULT.

+0

Tôi biết về ": HRESULT; stdcall" và giải pháp duy nhất hiện có là xóa an toàn khỏi nguồn (và tôi đang làm), nhưng có thể có giải pháp để làm việc với RTTI? – Mielofon

+0

Tôi không nghĩ rằng bạn cần phải thay đổi tuyên bố trong giao diện. Chỉ cần vượt qua hai tham số khi bạn gọi nó thông qua RTTI và đọc trong HRESULT như giá trị trả về của cuộc gọi đó. –

+0

Nếu tôi thay đổi thông số tính, sau đó tôi có Ngoại lệ trong kết quả: Số tham số không khớp. Đó là về: RttiHResultValue: = RttiMethod.Invoke (RttiInstance, [10, RttiReturnValue]); – Mielofon

Các vấn đề liên quan