5

Visual C++ で実装された私の COM サーバーは、他の大量の C++ コードを使用しています。他の C++ コードは、コードをラップして、構造化例外をカスタム C++ 例外に変換することが__tryあり__exceptます。この部分は私には変えられません。

私の COM サーバーのメソッドは、これらの例外が COM 境界を介して伝播することを許可しないため、それらをキャッチしてHRESULTs に変換する必要があります。これらのカスタム C++ 例外には、変換中に取得された元のエラー コードが含まれていますEXCEPTION_ACCESS_VIOLATION。問題は、クライアントが何が起こったのかについて可能な限り多くの情報を取得できるように、適切なHRESULT値をどのように作成するかです (そして、アクセス違反を見た後にサーバー (および inproc の場合はそれ自体) を再起動することを決定する可能性があります)。

EXCEPTION_ACCESS_VIOLATIONで定義されているとします。WinBase.h

#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION

後者はで定義されていますWinNT.h

#define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L)

そもそもWin32 エラーであると仮定して、HRESULT_FROM_WIN32()そのコードを変換するために使用できます。HRESULT

HRESULT_FROM_WIN32()ここで翻訳を行うべきですか、それとも他の方法を使用して翻訳を行うべきですか?

4

1 に答える 1

4

HRESULT操作のステータスを示すために適切なコードを選択する場合、コードを返すことになっています。失敗コードである必要はありませんが、通常は、 またはなどのFAILED(...)マクロを満たすものを表示する必要があります。E_FAILDISP_E_EXCEPTIONHRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)

呼び出し元が特定の例外関連と比較される可能性は非常に低いHRESULTため、特定のエラー コードは診断には意味があります。また、COM メソッドを終了する前に例外の処理を完了すると、HRESULT追加のアクションが不要または不要になるため、特定のコードを返す必要がありません。

追加情報を提供するにはISupportErrorInfo、 、IErrorInfoおよび friendsを使用できます。呼び出し元は、フリー テキストの説明と多くの一般的な環境を自動的に取得できます。たとえば、.NET 呼び出し元は、コードから生成された標準メッセージではなく、例外メッセージに関するこの追加情報を取得しHRESULTます。

ATL はAPIAtlReportErrorをラップすることを提案しており、コードの生成についても提案しています。SetErrorInfoHRESULT

...hResがゼロの場合、 の最初の 4 つのバージョンがAtlReportError返されDISP_E_EXCEPTIONます。最後の 2 つのバージョンは、マクロの結果を返しMAKE_HRESULT( 1, FACILITY_ITF, nID )ます。

于 2015-04-23T11:37:11.730 に答える