それについての私の理解 (いくつかの関連する MSDN ページに基づく) は、 を実装することによりISupportErrorInfo
、クラスの 1 つ以上のインターフェイスが を呼び出すことによってエラー情報を返すことを示しているSetErrorInfo
ということHRESULT
です。
そのために、 の実装は、呼び出し元にエラー情報を返すために実際に使用するクラスのインターフェイスのみ、およびそれらのインターフェイスのみを返すISuportErrorInfo::InterfaceSupportsErrorInfo
必要があります。S_OK
SetErrorInfo
たとえば、あなたが作成したIFoo
、メソッドを持つ、呼び出したインターフェイスを実装するクラスがあるとしますDoSomething
。他の誰かがあなたのクラスのインスタンスを作成して を呼び出した場合、失敗が返されたIFoo::DoSomething
場合は次のことを行う必要があります(さまざまな MSDN ページからの言い換えですが、私はここから始めました: http://msdn.microsoft.com/en-us/ライブラリ/ms221510.aspx ):DoSomething
HRESULT
ポインターを呼び出しQueryInterface
て、実装しているオブジェクトのインターフェイスを取得しますIFoo
ISupportErrorInfo
IFoo
呼び出されたオブジェクトが を実装していない場合ISupportErrorInfo
、呼び出し元は値に基づいてエラーを処理する
HRESULT
か、呼び出しスタックに渡す必要があります。
呼び出されたオブジェクトが を実装している場合ISupportErrorInfo
、呼び出し元は を呼び出し、エラーを返したインターフェイスISupportErrorInfo::InterfaceSupportsErrorInfo
の を渡す必要があります。REFIID
この場合、インターフェイスのDoSomething
メソッドがエラーを返したので、 (定義されていると仮定して) にIFoo
渡します。REFIID_IFoo
InterfaceSupportsErrorInfo
InterfaceSupportsErrorInfo
が返された場合S_OK
、呼び出し元はこの時点で、 を呼び出すことでエラーに関する詳細情報を取得できることを認識しています
GetErrorInfo
。InterfaceSupportsErrorInfo
が返された場合S_FALSE
、呼び出し元は、呼び出されたインターフェイスが詳細なエラー情報を提供していないと見なすことができ、返された HRESULT に依存して何が起こったのかを把握する必要があります。
この多少紛らわしい/複雑なエラー処理 API の理由は、柔軟性のためのようです (とにかく私が知る限り、これは結局 COM です;)。この設計では、クラスは複数のインターフェイスをサポートできますがSetErrorInfo
、メソッドからエラー情報を返すためにすべてのインターフェイスを使用する必要はありません。クラスの特定の選択されたインターフェースが を介して詳細なエラー情報を返すようにすることができSetErrorInfo
ますが、他のインターフェースは引き続き通常HRESULT
の を使用してエラーを示すことができます。
要約すると、ISupportErrorInfo
インターフェイスは、クラスが実装するインターフェイスの少なくとも 1 つが詳細なエラー情報を返すことができることを呼び出し元のコードに通知する方法であり、InterfaceSupportsErrorInfo
メソッドは、特定のインターフェイスがそれらのインターフェイスの 1 つであるかどうかを呼び出し元に通知します。その場合、呼び出し元は を呼び出して詳細なエラー情報を取得できますGetErrorInfo
。