我们的应用程序承载Windows脚本主机JScript引擎,并公开了几个可以从脚本代码调用的域对象。
其中一个域对象是实现IDispatch (实际上是IDispatchEx)的COM组件,它的方法将脚本函数作为回调参数(idis补丁*作为参数)。这个COM组件由脚本调用,做一些事情,然后通过提供的IDispatch参数调用脚本,然后返回到调用脚本。
如果回调脚本碰巧抛出一个异常(例如,调用另一个返回S_OK以外的东西的COM组件),那么对IDis补丁::调用回调脚本的调用将返回SCRIPT_E_PROPAGATE,而不是从另一个COM组件返回HRESULT;而不是从另一个COM对象返回预期的HRESULT。如果我将HRESULT (SCRIPT_E_PROPAGATE)返回给第一个COM组件的调用方(例如,调用脚本),那么脚本引擎将正确地抛出来自另一个COM对象的预期HRESULT错误。
然而,实际的错误却无处可寻。它不是从调用调用返回的(返回值是SCRIPT_E_PROPAGATE)。它不会通过为调用提供的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组件在调用时抛出异常到所提供的脚本函数?
发布于 2010-07-02 17:04:55
哇,这是严重的文件不足。
答案是:
在COM组件中对脚本进行回调.
注意:此链接包含上面描述的一些无文档的JScript HRESULTS。
https://stackoverflow.com/questions/3145992
复制相似问题