Наше приложение содержит движок JScript Windows Scripting Host и предоставляет несколько объектов домена, которые можно вызывать из кода скрипта.
Один из объектов домена - это COM-компонент, который реализует IDispatch (фактически IDispatchEx) и имеет метод, который принимает функцию сценария в качестве параметра обратного вызова (IDispatch * в качестве параметра). Этот COM-компонент вызывается сценарием, выполняет некоторые действия и затем вызывает обратно в сценарий с помощью предоставленного параметра IDispatch, прежде чем вернуться к вызывающему сценарию.
Если сценарий обратного вызова выдает исключение (например, делает вызов другому компоненту COM, который возвращает что-то отличное от S_OK), то вызов IDispatch :: Invoke в сценарии обратного вызова вместо этого возвращает SCRIPT_E_PROPAGATE HRESULT от другого компонента COM; не ожидаемый HRESULT от другого COM-объекта. Если я возвращаю этот HRESULT (SCRIPT_E_PROPAGATE) обратно вызывающей стороне первого COM-компонента (например, вызывающему сценарию), то обработчик сценариев корректно выдает ошибку с ожидаемым HRESULT из другого COM-объекта.
Однако, АКТУАЛЬНАЯ ОШИБКА нигде не найдена. Он не возвращается из вызова Invoke (возвращаемое значение - SCRIPT_E_PROPAGATE). Он не возвращается через EXCEPINFO, предоставленный Invoke (структура остается пустой). И, это не доступно через GetErrorInfo (вызов возвращает S_FALSE)!
Script
Defines ScriptCallback = function() { return ComComponentB.doSomething(); }
Invokes ComComponentA.execute(ScriptCallback)
Invokes ScriptCallback()
Invokes ComComponentB.doSomething()
Returns E_FAIL (or some other HRESULT)
Throws returned HRESULT
Receives SCRIPT_E_PROPAGATE <--- WHERE IS THE ACTUAL ERROR?
Returns SCRIPT_E_PROPAGATE
Throws E_FAIL (or whatever HRESULT was returned from ComComponentB)
Я бы действительно хотел бы получить в свое распоряжение эту ошибку, потому что было бы полезно кешировать ее и возвращать ту же ошибку при последующих вызовах (получение ошибки часто связано с дорогой операцией, которая определяется скриптом-функцией, передаваемой в качестве параметра, но я знаю, как кешировать ошибку). Есть ли способ для компонента COM со сценарием получить исключение, выброшенное во время обратного вызова в поставляемую функцию-скрипт ???