Как я делаю RTTI-вызов с помощью функции функции safecall для интерфейса?

У меня есть эта тестовая программа 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.

и у меня есть kaboom на

result := aI+1;

если это процедура или не является безопасным, тогда все в порядке: - (

Ответы

Ответ 1

Теперь, попробовав это сам, и посмотрел на код, я пришел к выводу, что есть ошибка. Блок RTTI действительно пытается выполнить перезапись метода safecall. Кажется, это неправильно. Я рекомендую вам представить свой проект в качестве отчета о контроле качества и обход проблемы, используя stdcall с возвращаемыми значениями HRESULT.