2013-02-21 10 views
15

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 :-(

Odpowiedz

5

Po wypróbowaniu tego teraz i spojrzeniu na kod, mój wniosek jest taki, że jest błąd. Jednostka RTTI rzeczywiście próbuje wykonać ponowne pisanie metody safecall. Wydaje się po prostu źle. Zalecam, aby przesłać projekt jako raport kontroli jakości i obejść problem, zwracając wartości: stdcall z wartościami .

+0

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

+0

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. –

+0

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

Powiązane problemy