このアプリケーションは、Windows Scripting Host JScriptエンジンをホストし、スクリプトコードから呼び出すことができるいくつかのドメインオブジェクトを公開します。
ドメインオブジェクトの1つは、IDispatch(実際にはIDispatchEx)を実装し、スクリプト関数をコールバックパラメーター(IDispatch *をパラメーター)として受け取るメソッドを持つCOMコンポーネントです。このCOMコンポーネントはスクリプトによって呼び出され、いくつかのことを実行してから、呼び出し元のスクリプトに戻る前に、指定されたIDispatchパラメーターを介してスクリプトにコールバックします。
コールバックスクリプトがたまたま例外をスローした場合(たとえば、S_OK以外のものを返す別のCOMコンポーネントを呼び出す場合)、コールバックスクリプトでIDispatch :: Invokeを呼び出すと、HRESULTではなくSCRIPT_E_PROPAGATEが返されます。他の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コンポーネントが、提供されたスクリプト関数へのコールバック中にスローされた例外を取得する方法はありますか?