Как поднять исключения в COM-сервер? - PullRequest
3 голосов
/ 12 апреля 2011

Как вызвать исключения на COM-сервере, который будет использоваться COM-клиентом?Мой сервер и клиент написаны на Delphi, если это имеет какое-то значение?В основном у меня есть фоновый поток, проверяющий различные вещи на моем сервере.Когда он не счастлив, он должен остановить все, что делает сервер, и вызвать исключение.Это исключение должно быть перехвачено клиентом.Не уверен, как справиться с этим, хотя.

1 Ответ

9 голосов
/ 12 апреля 2011

Простой ответ - нет. Исключения не являются частью спецификации взаимодействия COM и поэтому не должны пересекать границы модуля. Вы указываете ошибки с кодами состояния.

Перехватите исключение непосредственно перед выходом из вашего метода (в каждом методе интерфейса COM). Превратите результат в код ошибки. Если вы используете HRESULT, вы можете использовать его как safecall и заставить компилятор Delphi повторно вызвать исключение на другой стороне забора.


Всегда знающий Роб Кеннеди отмечает в комментарии, что safecall можно использовать «по обе стороны забора», что делает жизнь даже проще, чем описано выше.

Я вообще не эксперт в этом (отсюда необходимость просвещаться в комментариях Роба). Однако документация указывает, что при реализации подпрограмм safecall необходимо переопределить TObject.SafeCallException, чтобы преобразовать исключения в HRESULT коды ошибок. Некоторые из стандартных классов, относящихся к COM, предоставляют переопределенные версии, но вам может понадобиться добавить некоторую собственную логику в смесь. Компилятор записывает неявные блоки Try / Except в подпрограммах безопасного вызова, которые обрабатывают исключения, вызывая эту виртуальную функцию.

...