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