我们的应用程序托管 Windows Scripting Host JScript 引擎并公开几个可以从脚本代码调用的域对象。
其中一个域对象是一个 COM 组件,它实现了 IDispatch(实际上是 IDispatchEx),它有一个将脚本函数作为回调参数的方法(一个 IDispatch* 作为参数)。此 COM 组件由脚本调用,执行一些操作,然后通过提供的 IDispatch 参数回调到脚本中,然后返回调用脚本。
如果回调脚本碰巧抛出异常(例如,调用另一个 COM 组件,它返回的不是 S_OK),那么对回调脚本的 IDispatch::Invoke 调用将返回 SCRIPT_E_PROPAGATE 而不是 HRESULT来自其他 COM 组件;不是来自其他 COM 对象的预期 HRESULT。如果我将该 HRESULT (SCRIPT_E_PROPAGATE) 返回给第一个 COM 组件的调用者(例如,返回给调用脚本),那么脚本引擎会正确地从另一个 COM 对象抛出一个带有预期 HRESULT 的错误。
但是,找不到实际错误。它不是从 Invoke 调用返回的(返回值为 SCRIPT_E_PROPAGATE)。它不是通过提供给 Invoke 的 EXCEPINFO 返回的(结构保持为空)。而且,它不能通过 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 组件在回调到提供的脚本函数时遇到异常???