powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RAD Studio 10.3 Rio
15 сообщений из 1 165, страница 47 из 47
RAD Studio 10.3 Rio
    #39875898
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39875984
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  intr := TVirtualInterface.Create(TypeInfo(ISafeCallInterfaceError),
    procedure (Method: TRttiMethod; const Args: TArray<TValue>; out Result: TValue)
    begin
      Args[1] := 100; //No Result argument
      Result := S_OK;
    end) as ISafeCallInterfaceError;
  Writeln(intr.GetValue); //-- error here (GetValue)


1) "No result argument" - это верно, так как результат возвращается через "Result" аргумент.
2) "error here" - какая собственно error там ?
3) Я думаю, что это "by design", так как реализация позволяет вызовы так, как они есть в родном Delphi коде, т.е.:
Код: pascal
1.
2.
3.
function GetValue: Integer; safecall;
....
Writeln(Intf.GetValue);


последнее должно вывести не S_OK, а то что GetValue возвращает.

Или я что-то пропустил ?
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876193
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  intr := TVirtualInterface.Create(TypeInfo(ISafeCallInterfaceError),
    procedure (Method: TRttiMethod; const Args: TArray<TValue>; out Result: TValue)
    begin
      Args[1] := 100; //No Result argument
      Result := S_OK;
    end) as ISafeCallInterfaceError;
  Writeln(intr.GetValue); //-- error here (GetValue)


1) "No result argument" - это верно, так как результат возвращается через "Result" аргумент.
2) "error here" - какая собственно error там ?
3) Я думаю, что это "by design", так как реализация позволяет вызовы так, как они есть в родном Delphi коде, т.е.:
Код: pascal
1.
2.
3.
function GetValue: Integer; safecall;
....
Writeln(Intf.GetValue);


последнее должно вывести не S_OK, а то что GetValue возвращает.

Или я что-то пропустил ?
Пропустил то, что функция GetValue описана как safecall. Поэтому результат возвращается в последнем аргументе по ссылке. В Result - должен быть HRESULT, который должен быть в eax/rax и который потом передается в функцию CheckAutoResult.
https://stackoverflow.com/questions/96042/whats-safecall
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876196
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev,
Вот прототип функции safecall с stdcall. Вот что в итоге должно быть:
Код: pascal
1.
function DoSomething ( a : DWORD ; out Result : DWORD ) : HResult; stdcall;
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876202
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014, еще раз нативный код должен соответствовать динамическому вызову. И в Result должен быть результат исполнения метода, а не HRESULT. Ты же не будешь писать:
{code}
function Xxxx.GetValue: Integer; safecall;
begin
// хз как и через что возвращать реальный результат, но за то ...
Result := S_OK;
end;
{code}
safecall это соглашения о вызове, но не модификатор логики работы с аргументами и возвращаемым значением. Прочувствуй смысл этой фразы ...
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876206
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Dmitry Arefiev,
Вот прототип функции safecall с stdcall. Вот что в итоге должно быть:
Код: pascal
1.
function DoSomething ( a : DWORD ; out Result : DWORD ) : HResult; stdcall;


Ну теперь попробуй код реального safecall метода засунуть сюда один в один ...
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876208
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: сорри, сюда засунеться, но кто теперь Result ??
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876211
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev,
Запустите отладчик и выполните метод с safecall и вам все станет понятно. Результат (Result) передается через стек, а результат (HRESULT) через eax/rax, как любой результат функции. Что-то не понятно?
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876213
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev, Далее наступает магия компилятора, который дополнительно вызывает CheckAutoResult и если результат (HRESULT) не является ошибкой, то сохраняет переменную (Result) туда куда надо, если же результат (HRESULT) является ошибкой происходит обработка ошибки (см. TInterfacedObject)
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876215
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014, Точнее ошибки в SafeCallErrorProc.
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876220
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я в курсе как оно устроено ... Ладно, новый аргумент, меняя соглашение о вызове для метода, тело анонимного метода в TVirtualInterface.Create должно меняться ? Нет, наверное ...
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876221
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefievziv-2014Dmitry Arefiev,
Вот прототип функции safecall с stdcall. Вот что в итоге должно быть:
Код: pascal
1.
function DoSomething ( a : DWORD ; out Result : DWORD ) : HResult; stdcall;


Ну теперь попробуй код реального safecall метода засунуть сюда один в один ...
Вызов будет
Код: pascal
1.
2.
3.
4.
function DoSomething ( a : DWORD ; out Result : DWORD ) : HResult; stdcall;
...
type TSafecallDoSomething = function DoSomething(a : DWORD) : DWORD; safecall;
var n : DWORD := TSafecallDoSomething(@DoSomething)(0);


Код будет работать.
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876224
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Код будет работать.
И это должен проделывать каждый программер ? Или же все-таки это магия компилятора, являющаяся частью соглашения о вызове ? И если это магия являющаяся частью, то чему должно следовать TVirtualInterface ?
PS: ты не спеши написать, а реально задайся этими вопросами ...
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876226
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или ты хочешь поставить вопрос - и как же получить HRESULT из safecall метода ? Если так, то это понятно, и это фича реквест для TVirtualInterface
...
Рейтинг: 0 / 0
RAD Studio 10.3 Rio
    #39876229
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefievziv-2014Код будет работать.
И это должен проделывать каждый программер ? Или же все-таки это магия компилятора, являющаяся частью соглашения о вызове ? И если это магия являющаяся частью, то чему должно следовать TVirtualInterface ?
PS: ты не спеши написать, а реально задайся этими вопросами ...
Если этому не следовать, то результат в eax будет случайным, а следовательно вызов CheckAutoResult со случайным параметром будет отрабатываться случайным образом. Ну а дальше сам думай, задайся так сказать вопросом и не спеши писать.
...
Рейтинг: 0 / 0
15 сообщений из 1 165, страница 47 из 47
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RAD Studio 10.3 Rio
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]