mam ten program testowy https://gist.github.com/real-mielofon/5002732Jak wykonać połączenie RTTI z interfejsem funkcji safeecall?
RttiValue := RttiMethod.Invoke(RttiInstance, [10]);
i proste urządzenie z interfejsem:
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.
i mam Kaboom na
result := aI+1;
jeśli jest to procedura, czy nie jest safecall, to wszystko w porządku :-(
Wiem o ": HRESULT; stdcall" i jedynym dostępnym obecnie rozwiązaniem jest usuwanie safecall ze źródła (i robię to), ale może istnieje rozwiązanie, jak dostać się do pracy z RTTI? – Mielofon
Nie sądzę, że musisz zmienić deklarację w interfejsie. Wystarczy podać dwa parametry, gdy wywołasz je za pomocą RTTI i odczytaj w HRESULT jako wartość zwracaną tego połączenia. –
Jeśli zmienię parametry liczenia, to w wyniku otrzymałem wyjątek: Niedopasowanie liczby parametrów. To jest około: RttiHResultValue: = RttiMethod.Invoke (RttiInstance, [10, RttiReturnValue]); – Mielofon