Я нашел кусочки этого ответа в Интернете, но не кристально чистое решение.
Вот что я пытаюсь сделать.
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, которое не приведет к аварийному завершению вызова.
Когда вы пишете код для клиента сценариев, вы должны использовать подмножество COM, называемое автоматизацией. Что диктует это:
В частности, это означает, что BOOL не разрешен, он должен быть VARIANT_BOOL. Вы объявляете метод, который возвращает логическое значение, записывая его в IDL следующим образом:
[id(42)] HRESULT Foo([out,retval] VARIANT_BOOL* retval);
Назначьте VARIANT_TRUE или VARIANT_FALSE для * retval в вашем коде. Язык сценариев использует естественный синтаксис, такой как var = Foo()
,
Вы генерируете исключение в клиенте сценариев, возвращая ошибку HRESULT.
Вы можете заставить клиента обрабатывать «исключение»,
Итак, вам нужны интерфейсы, совместимые с IDispatch / Interop, для которых требуются возвращаемые типы HRESULT (AFAIR).
IDL позволяет гораздо больше, но «динамические» клиенты, такие как хосты сценариев (VBS, JScript, VBA и другие), не используют их изначально, поэтому совместимость не будет оптимальной.