Как вернуть положительный HResult в методе safecall?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

Всем привет!

Есть вопросец по COM. Можно ли как то в Delphi в методе который объявлен как SafeCall вернуть положительный код HResult?
Как отрицательный код вернуть знаю, а вот положительный чет незнаю никак.
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Result := S_OK;
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

неее, прошу обратить внимание на соглашение safecall...
В случае использования соглашения SafeCall, методы интерфеса уже не имеют возвращаемое значение HResult. Обруботку HResult методов COM и их присвоение ведет сам Delphi, он как бы скрывает это... использование соглашение safecall допустим позволяет использовать не такую функцию:
function GetInterface(out Itf:IUnknown):HResult;
а такую:
function GetInterface:IUnknown;

также соглашение safecall позволяет обрабатывать все ошибки происходящие во время работы COM. Т.е. в случае если HResult отрицательный, то генерируется исключение в которое записывается информация из IErrorInfo.

но исключение не всегда устраивает и иногда нужно получить информацию об ошибке способом анологичным в WinAPI, типа GetLastError, я думал сделать это возвращением положительного когда ошибки(HResult), т.к. по соглашению safecall исключение
будет генерится только если HResult отрицательный, если он положительный то исключение не генерится.
И вот вопрос как его вернуть? Отрицательный код можно вернуть сгенерировав исключение EOleException по которому Delphi устанавливает HResult и IErrorInfo, а вот положительный не получается...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Поскольку HResult возвращается через стек, можно только прямой записью в сам стек. Никаких Access Violation быть не должно...
It's a long way to the top if you wanna rock'n'roll
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

Попробую, но есть сомнения что после меня туда же запишет S_OK Delphi....
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):Попробую, но есть сомнения что после меня туда же запишет S_OK Delphi....
Делаешь так - ставишь бряк на енде функции - нажимаешь Ctrl+Alt+C - смотришь код
Делаешь тоже самое на ASM но плюс - меняешь на стеке hResult
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Использование соглашения о вызовах safecall не является необходимым/обязательным для любых Delphi-интерфейсов. safecall просто создаёт вокруг тела процедуры блок try-except-end, в котором исключение переводится в HRESULT. Это просто удобно, но не более того.
Таким образом вернуть свой HRESULT у тебя не получится. Придётся обходиться без safecall и возвращать результат самостоятельно
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Вместо safecall в объявлениях интерфейса нужно написать stdcall
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):Таким образом вернуть свой HRESULT у тебя не получится
Через стек получится, проверено...
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

&quot писал(а):Через стек получится, проверено...
Недокументированные возможности :) Чревато ошибками... в неумелых руках :)
Ответить