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 :-(
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
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 đó. –
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