14

ISupportErrorInfoインターフェイスはどういう意味ですか?私はそれを理解するのに少し戸惑っています。MSDNから:

このインターフェイスにより、エラー情報をコールチェーンの上位に正しく伝播できます。エラー処理インターフェースを使用する自動化オブジェクトは、ISupportErrorInfoを実装する必要があります。

このメソッドは、インターフェイスがIErrorInfoインターフェイスをサポートしているかどうかを示します。

HRESULT InterfaceSupportsErrorInfo(
  REFIID riid
);

S_OKを返すとはどういう意味InterfaceSupportsErrorInfoですか?すべてのインターフェースに対してS_OKを返す必要がありますか?ほんの一部?

4

1 に答える 1

22

それについての私の理解 (いくつかの関連する MSDN ページに基づく) は、 を実装することによりISupportErrorInfo、クラスの 1 つ以上のインターフェイスが を呼び出すことによってエラー情報を返すことを示しているSetErrorInfoということHRESULTです。

そのために、 の実装は、呼び出し元にエラー情報を返すために実際に使用するクラスのインターフェイスのみ、およびそれらのインターフェイスのみを返すISuportErrorInfo::InterfaceSupportsErrorInfo必要があります。S_OKSetErrorInfo

たとえば、あなたが作成したIFoo、メソッドを持つ、呼び出したインターフェイスを実装するクラスがあるとしますDoSomething。他の誰かがあなたのクラスのインスタンスを作成して を呼び出した場合、失敗が返されたIFoo::DoSomething場合は次のことを行う必要があります(さまざまな MSDN ページからの言い換えですが、私はここから始めました: http://msdn.microsoft.com/en-us/ライブラリ/ms221510.aspx ):DoSomethingHRESULT

  • ポインターを呼び出しQueryInterfaceて、実装しているオブジェクトのインターフェイスを取得しますIFooISupportErrorInfoIFoo

  • 呼び出されたオブジェクトが を実装していない場合ISupportErrorInfo、呼び出し元は値に基づいてエラーを処理する HRESULTか、呼び出しスタックに渡す必要があります。

  • 呼び出されたオブジェクトが を実装している場合ISupportErrorInfo、呼び出し元は を呼び出し、エラーを返したインターフェイスISupportErrorInfo::InterfaceSupportsErrorInfoの を渡す必要があります。REFIIDこの場合、インターフェイスのDoSomethingメソッドがエラーを返したので、 (定義されていると仮定して) にIFoo渡します。REFIID_IFooInterfaceSupportsErrorInfo

  • InterfaceSupportsErrorInfo が返された場合S_OK、呼び出し元はこの時点で、 を呼び出すことでエラーに関する詳細情報を取得できることを認識しています GetErrorInfoInterfaceSupportsErrorInfoが返された場合S_FALSE、呼び出し元は、呼び出されたインターフェイスが詳細なエラー情報を提供していないと見なすことができ、返された HRESULT に依存して何が起こったのかを把握する必要があります。

この多少紛らわしい/複雑なエラー処理 API の理由は、柔軟性のためのようです (とにかく私が知る限り、これ結局 COM です;)。この設計では、クラスは複数のインターフェイスをサポートできますがSetErrorInfo、メソッドからエラー情報を返すためにすべてのインターフェイスを使用する必要はありません。クラスの特定の選択されたインターフェースが を介して詳細なエラー情報を返すようにすることができSetErrorInfoますが、他のインターフェースは引き続き通常HRESULTの を使用してエラーを示すことができます。

要約すると、ISupportErrorInfoインターフェイスは、クラスが実装するインターフェイスの少なくとも 1 つが詳細なエラー情報を返すことができることを呼び出し元のコードに通知する方法であり、InterfaceSupportsErrorInfoメソッドは、特定のインターフェイスがそれらのインターフェイスの 1 つであるかどうかを呼び出し元に通知します。その場合、呼び出し元は を呼び出して詳細なエラー情報を取得できますGetErrorInfo

于 2008-10-06T04:40:21.053 に答える