4

私はウェブ上でこの回答の断片を見つけてきましたが、非常に明確な解決策ではありません。

これが私がやろうとしていることです。1) ATL シンプル オブジェクトを作成します。2) そのオブジェクトに、HRESULT ではなく BOOL を返すメソッドを追加します。呼び出し元は、true/false の戻り値が必要です。3) e.description および e.number データを提供する jscript または vbscript 呼び出し元に例外をスローします。

RE 2) STDMETHODIMP_(BOOL) を [local] と共に使用して、BOOL を返すことができることがわかりました RE 3) SetErrorInfo() を介して IErrorInfo を渡して、エラー オブジェクトを設定できることがわかりました

私のジレンマは、呼び出し元をクラッシュさせない ABI 境界を越えて例外をスローするように C++ を設計する方法を理解できないことです。

4

2 に答える 2

4

スクリプト クライアント用のコードを記述する場合は、オートメーションと呼ばれる COM のサブセットを使用する必要があります。これは、次のことを示しています。

  • すべてのインターフェイスは IDispatch から派生する必要があります
  • コクラスは 1 つのソース インターフェイスのみを実装する必要があります
  • すべてのメソッドは HRESULT を返す必要があり、STDMETHODIMP のみが有効です
  • 引数の型は、オートメーションで許可されているサブセットに制限する必要があります。

特に、これは BOOL が許可されていないことを意味し、VARIANT_BOOL でなければなりません。IDL で次のように記述して、ブール値を返すメソッドを宣言します。

 [id(42)] HRESULT Foo([out,retval] VARIANT_BOOL* retval);

コードで VARIANT_TRUE または VARIANT_FALSE を *retval に割り当てます。スクリプト言語は、 のような自然な構文を使用しますvar = Foo()

失敗した HRESULT を返すことによって、スクリプト クライアントで例外を生成します。

于 2012-09-26T19:26:29.430 に答える
1

クライアントに「例外」を処理させることができます

  1. あなたが言ったように IErrorInfo を設定する
  2. 非 HRESULT hr を返す != S_OK

したがって、HRESULT 戻り型 (AFAIR) を必要とする IDispatch/Interop 互換インターフェイスが必要です。

IDL はさらに多くのことを許可しますが、スクリプト ホスト (VBS、JScript、VBA など) のような「動的」クライアントはそれらをネイティブに使用しないため、相互運用性は最適ではありません。

于 2012-09-26T18:41:04.240 に答える