いちばんやさしいゲームの作り方

文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ

HRESULT 型を取り扱う際に注意する点です。

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

//

成功と失敗の判定には SUCCEEDED マクロと FAILED マクロを使う

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 の内容を文字列に変換するためには FormatMessage() 関数を使う

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




Trackback URL

メルマガ登録・解除
 
挫折不可能!初級ゲームプログラミング完全マニュアル
RSS track feedいちばんやさしいゲームの作り方 カウンター
ブログSEO対策:track word あわせて読みたい SEO STATUS