深奥的JScript托管问题:IDispatch :: Invoke返回SCRIPT_E_PROPAGATE时错误代码在哪里?

问题描述 投票:2回答:1

我们的应用程序承载Windows脚本宿主JScript引擎,并公开了几个可以从脚本代码中调用的域对象。

域对象之一是COM组件,该组件实现IDispatch(实际上是IDispatchEx),并且具有将脚本功能作为回调参数(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组件是否有办法在回调到提供的脚本功能的过程中引发异常?

我们的应用程序承载Windows脚本宿主JScript引擎,并公开了几个可以从脚本代码中调用的域对象。域对象之一是实现...

c++ com javascript wsh idispatch
1个回答
2
投票

哇,这个文档严重不足。

© www.soinside.com 2019 - 2024. All rights reserved.