1

Kenny Kerr は、msdn マガジンのイメージングと Direct2D に関する記事で、頻繁にHR()マクロを使用しています。

彼の Windows Imaging Component の記事 - http://msdn.microsoft.com/en-gb/magazine/cc500647.aspx

彼は書く -

最後に、WIC API は HRESULT を使用してエラーを記述します。この記事のサンプルでは、​​HR マクロを使用して、確認が必要な HRESULT をメソッドが返す場所を明確に識別しています。これは、例外をスローするか、HRESULT を自分で返すかに関係なく、独自のエラー処理戦略に置き換えることができます。

HR(decoder.CoCreateInstance(CLSID_WICTiffDecoder));

しかし、ケニーは の定義を示していませんHR()。私は C++ の初心者で、コードの詳細を発見して理解しようとしています。私のプログラムでHR()を処理する最善の方法を検討できるように、彼の実装が何であるかを知りたいです。HRESULT定義を検索しましたが、これらの特定の記事のソース コードはないようです。

私について学んでいる間、マクロの代わりに関数macrosの使用を提案するこれらの最近のドキュメントに出くわしました-inline

http://msdn.microsoft.com/en-us/library/vstudio/ttsbh614.aspx

http://msdn.microsoft.com/en-us/library/vstudio/z8y1yy88.aspx

HR()ケニーが彼のマクロをどのように定義しているか誰か教えてもらえますか? そして、それは実際に何をしますか?

Direct2D プログラムは s をどのように処理する必要がありHRESULTますか? HRESULTプログラムの信頼性と回復力を高めるために、s を適切に使用する方法は何ですか?

4

2 に答える 2

5

ケニーのマクロについてはよくわかりませんが、次のことを絶対に知っておく必要があると思います。エラーコードには最上位ビットが設定されており、値全体が負になります。これにぴったりの「標準」マクロSUCCEEDEDFAILEDテストコード。

HRESULT nValue = ...
if(SUCCEEDED(nValue)) {
  // Not Error
} 

次に、コードの簡潔さと読みやすさのために、両方のことを一緒に行うマクロが必要になります。成功/失敗をテストし、エラーを返すか、例外をスローします。HR問題のマクロは2つのうちの1つを実行すると思います。

ATLを使用する場合は、この種の事前定義されたマクロがすでにありますATLENSURE_SUCCEEDEDATLENSURE_THROWなど。Microsoftはそれらを文書化しないことを決定しました(ここで提供するMSDNリンクを認識していません)。

あなたHRは次のようなものになる可能性があります(目的のアクションに応じて-エラー時にスローまたは終了する):

inline VOID HR(HRESULT nValue) { if(FAILED(nValue)) AtlThrow(nValue); }

また

#define HR(x) { HRESULT nValue = (x); if(FAILED(nValue)) return nValue; }

また、WICとD2Dを便利にデコードするHRESULTには、このシステムトレイヘルパーアプリを使用することをお勧めします。

于 2012-11-20T20:17:51.090 に答える
0

Kenny によるこの MSDN の記事は、例外のスローを含むエラー処理の可能なアプローチを他の人が理解するのに役立つかもしれません: MSDN - C++ and the Windows API July 2012

于 2014-11-24T23:56:01.673 に答える