Как вызвать исключение из C ++, которое будет запускать обработчики исключений сценариев

Я нашел кусочки этого ответа в Интернете, но не кристально чистое решение.

Вот что я пытаюсь сделать.
1) Создайте простой объект ATL.
2) Добавьте метод к тому объекту, который возвращает BOOL, а не HRESULT. Вызывающая сторона хочет вернуть значения true / false.
3) Создайте исключение для вызывающего jscript или vbscript, который предоставит данные e.description и e.number.

RE 2) Я обнаружил, что могу использовать STDMETHODIMP_ (BOOL) вместе с [local], чтобы разрешить возврат BOOL RE 3) Я обнаружил, что могу передать IErrorInfo через SetErrorInfo () для заполнения объекта Error

Моя дилемма в том, что я не могу понять, как спроектировать C ++, чтобы создать исключение через границу ABI, которое не приведет к аварийному завершению вызова.

4

Решение

Когда вы пишете код для клиента сценариев, вы должны использовать подмножество COM, называемое автоматизацией. Что диктует это:

  • все интерфейсы должны быть получены из IDispatch
  • Coclass должен реализовывать только один исходный интерфейс
  • все методы должны возвращать HRESULT, допустим только STDMETHODIMP
  • типы аргументов должны быть ограничены подмножеством, разрешенным Automation.

В частности, это означает, что BOOL не разрешен, он должен быть VARIANT_BOOL. Вы объявляете метод, который возвращает логическое значение, записывая его в IDL следующим образом:

 [id(42)] HRESULT Foo([out,retval] VARIANT_BOOL* retval);

Назначьте VARIANT_TRUE или VARIANT_FALSE для * retval в вашем коде. Язык сценариев использует естественный синтаксис, такой как var = Foo(),

Вы генерируете исключение в клиенте сценариев, возвращая ошибку HRESULT.

4

Другие решения

Вы можете заставить клиента обрабатывать «исключение»,

  1. установка IErrorInfo, как вы сказали
  2. возвращение не HRESULT hr! = S_OK

Итак, вам нужны интерфейсы, совместимые с IDispatch / Interop, для которых требуются возвращаемые типы HRESULT (AFAIR).

IDL позволяет гораздо больше, но «динамические» клиенты, такие как хосты сценариев (VBS, JScript, VBA и другие), не используют их изначально, поэтому совместимость не будет оптимальной.

1

По вопросам рекламы [email protected]