HRESULT 型を取り扱う際に注意する点です。
HRESULT 型のデータフォーマットは次のようになっています。ソースコードのコピペでご容赦ください(ちなみに WinError.h に記載されています)。
// // Values are 32 bit values laid out as follows: // // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 // +---+-+-+-----------------------+-------------------------------+ // |Sev|C|R| Facility | Code | // +---+-+-+-----------------------+-------------------------------+ // // where // // Sev - is the severity code // // 00 - Success // 01 - Informational // 10 - Warning // 11 - Error // // C - is the Customer code flag // // R - is a reserved bit // // Facility - is the facility code // // Code - is the facility's status code // // // Define the facility codes //
HRESULT 型で返される状態は true と false の2種類ではなく、 0×00000000 から 0xFFFFFFFF という広大な空間を利用します。 Windows (Intel) C++ の if 文の実装は !0 を true, 0 を false としているため、単純に…
HRESULT hr = SomeComMethod(); if (hr) { // 成功 } else { // 失敗 }
…と書くと、プログラムが正しく動作しなくなる可能性があります。 HRESULT 型の成功と失敗を正しく分析するためには SUCCEEDED マクロと FAILED マクロを使います。 SUCCEEDED マクロは成功を FAILED マクロは失敗を判定します。
HRESULT hr = SomeComMethod(); if (SUCCEEDED(hr)) { // 成功 } if (FAILED(hr)) { // 失敗 }
HRESULT 型が示す結果を詳細に分析したい場合は、用意されている定数と比較します。どのような定数が用意されているかの詳細は WinError.h に記されていますので参照してください。
HRESULT 型のデータは 32bit の整数値ですが、この結果が示す内容を文字列に変換するためには FormatMessage() 関数を使います。これは、エラーメッセージをログに記録したい場合などに使うことができます。
LPVOID string; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, /* HRESULT の値 */, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 既定の言語 (LPTSTR)&string, 0, NULL); // エラーメッセージを表示する MessageBox(NULL, (LPCTSTR)string, TEXT("Error"), MB_OK); // バッファを解放する LocalFree(string);
Contributions