我们的应用程序托管Windows Scripting Host JScript引擎,并公开可以从脚本代码调用的多个域对象。
其中一个域对象是实现IDispatch(实际上是IDispatchEx)的COM组件,它有一个将脚本函数作为回调参数(IDispatch *作为参数)的方法。这个COM组件由脚本调用,做一些事情,然后在返回调用脚本之前通过提供的IDispatch参数调回脚本。
如果回调脚本碰巧抛出异常(例如,调用另一个返回S_OK以外的东西的COM组件),那么对回调脚本上的IDispatch :: Invoke的调用将返回SCRIPT_E_PROPAGATE而不是来自其他COM组件的HRESULT;不是来自其他COM对象的预期HRESULT。如果我将HRESULT(SCRIPT_E_PROPAGATE)返回给第一个COM组件的调用者(例如,返回到调用脚本),那么脚本引擎会正确地从另一个COM对象中抛出一个带有预期HRESULT的错误。
然而, ACTUAL ERROR 无处可寻。它不是从Invoke调用返回的(返回值是SCRIPT_E_PROPAGATE)。它不是通过提供给Invoke的EXCEPINFO返回的(结构保持为空)。 AND,它不能通过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组件在回调到提供的脚本函数期间抛出异常???
答案 0 :(得分:2)
答案是:
在COM组件中进行回调...
注意:code in the GoogleWebKit包含一些上述未记录的JScript HRESULTS。