Страница 1 из 1
Как вернуть положительный HResult в методе safecall?
Добавлено: 28 фев 2007, 13:09
Пабло
Всем привет!
Есть вопросец по COM. Можно ли как то в Delphi в методе который объявлен как SafeCall вернуть положительный код HResult?
Как отрицательный код вернуть знаю, а вот положительный чет незнаю никак.
Re: Как вернуть положительный HResult в методе safecall?
Добавлено: 03 мар 2007, 09:59
SergeyS
Result := S_OK;
Re: Как вернуть положительный HResult в методе safecall?
Добавлено: 06 мар 2007, 09:56
Пабло
неее, прошу обратить внимание на соглашение 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, а вот положительный не получается...
Re: Как вернуть положительный HResult в методе safecall?
Добавлено: 06 мар 2007, 10:41
somewhere
Поскольку HResult возвращается через стек, можно только прямой записью в сам стек. Никаких Access Violation быть не должно...
Re: Как вернуть положительный HResult в методе safecall?
Добавлено: 06 мар 2007, 15:26
Пабло
Попробую, но есть сомнения что после меня туда же запишет S_OK Delphi....
Re: Как вернуть положительный HResult в методе safecall?
Добавлено: 06 мар 2007, 17:03
somewhere
" писал(а):Попробую, но есть сомнения что после меня туда же запишет S_OK Delphi....
Делаешь так - ставишь бряк на енде функции - нажимаешь Ctrl+Alt+C - смотришь код
Делаешь тоже самое на ASM но плюс - меняешь на стеке hResult
Re: Как вернуть положительный HResult в методе safecall?
Добавлено: 08 мар 2007, 09:21
SergeyS
Использование соглашения о вызовах safecall не является необходимым/обязательным для любых Delphi-интерфейсов. safecall просто создаёт вокруг тела процедуры блок try-except-end, в котором исключение переводится в HRESULT. Это просто удобно, но не более того.
Таким образом вернуть свой HRESULT у тебя не получится. Придётся обходиться без safecall и возвращать результат самостоятельно
Re: Как вернуть положительный HResult в методе safecall?
Добавлено: 08 мар 2007, 09:34
SergeyS
Вместо safecall в объявлениях интерфейса нужно написать stdcall
Re: Как вернуть положительный HResult в методе safecall?
Добавлено: 09 мар 2007, 10:28
somewhere
" писал(а):Таким образом вернуть свой HRESULT у тебя не получится
Через стек получится, проверено...
Re: Как вернуть положительный HResult в методе safecall?
Добавлено: 09 мар 2007, 11:37
SergeyS
" писал(а):Через стек получится, проверено...
Недокументированные возможности

Чревато ошибками... в неумелых руках
