Win32API エラーコードの説明を取得する FormatMessage

Win32APIの関数呼び出し後に、GetLastError関数を呼び出してエラーコードを取得する際に、エラーコードの説明を取得したい場合もある。このときには、FormatMessage関数を用いる。

DWORD FormatMessage(
  DWORD dwFlags,      // 入力元と処理方法のオプション
  LPCVOID lpSource,   // メッセージの入力元
  DWORD dwMessageId,  // メッセージ識別子
  DWORD dwLanguageId, // 言語識別子
  LPTSTR lpBuffer,    // メッセージバッファ
  DWORD nSize,        // メッセージバッファの最大サイズ
  va_list *Arguments  // 複数のメッセージ挿入シーケンスからなる配列
);


  • FormatMessage関数のサンプルプログラム

  • エラーコード0から255までの説明を取得し、コンソールに表示する

    #include <windows.h>
    #include <stdio.h>
    #include <locale.h>
    
    int main()
    {
        TCHAR lpBuffer[512];
        DWORD i;
        DWORD dwRet;
    
        //Unicode文字列を表示させるため
        setlocale(LC_ALL, setlocale(LC_CTYPE, ""));
    
        for (i = 0; i < 256; i++) {
    
            dwRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                NULL,
                i,
                0,
                lpBuffer,
                sizeof(lpBuffer)/sizeof(lpBuffer[0]),
                NULL);
    
            if (dwRet > 0) {//関数成功時は、バッファに格納した文字数が返る
                _tprintf(TEXT("%d, %s"), i, lpBuffer);
            } else {//関数失敗時は、0が返る
                _tprintf(TEXT("%d, \n"), i);
            }
    
        }
    
        return 0;
    }



  • 実行結果
  • 0, この操作を正しく終了しました。
    1, ファンクションが間違っています。
    2, 指定されたファイルが見つかりません。
    3, 指定されたパスが見つかりません。
    4, ファイルを開くことができません。
    5, アクセスが拒否されました。
    6, ハンドルが無効です。
    7, 記憶域制御ブロックが壊れています。
    8, このコマンドを実行するのに十分な記憶域がありません。
    9, 記憶域制御ブロックのアドレスが無効です。
    10, 環境が間違っています。
    11, 間違ったフォーマットのプログラムを読み込もうとしました。
    12, アクセス コードが無効です。
    13, データが無効です。
    14, この操作を完了するのに十分な記憶域がありません。
    15, 指定されたドライブが見つかりません。
    16, ディレクトリを削除できません。
    17, ファイルを別のディスク ドライブに移動できません。
    18, これ以上ファイルがありません。
    19, このメディアは書き込み禁止になっています。
    20, 指定されたデバイスが見つかりません。
    21, デバイスの準備ができていません。
    22, デバイスがコマンドを認識できません。
    23, データ エラー (巡回冗長検査 (CRC) エラー) です。
    24, プログラムはコマンドを発行しましたが、コマンドの長さが間違っています。
    
    (以下255まで続く)
    



    参考
    http://msdn.microsoft.com/ja-jp/library/cc428939.aspx