Как вернуть положительный HResult в методе safecall?
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Всем привет!
Есть вопросец по COM. Можно ли как то в Delphi в методе который объявлен как SafeCall вернуть положительный код HResult?
Как отрицательный код вернуть знаю, а вот положительный чет незнаю никак.
Есть вопросец по COM. Можно ли как то в Delphi в методе который объявлен как SafeCall вернуть положительный код HResult?
Как отрицательный код вернуть знаю, а вот положительный чет незнаю никак.
неее, прошу обратить внимание на соглашение 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, а вот положительный не получается...
В случае использования соглашения 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, а вот положительный не получается...
Поскольку HResult возвращается через стек, можно только прямой записью в сам стек. Никаких Access Violation быть не должно...
It's a long way to the top if you wanna rock'n'roll
Попробую, но есть сомнения что после меня туда же запишет S_OK Delphi....
Делаешь так - ставишь бряк на енде функции - нажимаешь Ctrl+Alt+C - смотришь код" писал(а):Попробую, но есть сомнения что после меня туда же запишет S_OK Delphi....
Делаешь тоже самое на 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 и возвращать результат самостоятельно
Таким образом вернуть свой HRESULT у тебя не получится. Придётся обходиться без safecall и возвращать результат самостоятельно
Через стек получится, проверено..." писал(а):Таким образом вернуть свой HRESULT у тебя не получится
It's a long way to the top if you wanna rock'n'roll