.NET TIPS

Win32 APIのWin32エラー・コードを取得するには?[C#、VB]

デジタルアドバンテージ 一色 政彦
2008/05/15

 「TIPS:Win32 APIやDLL関数を呼び出すには?」では.NETプログラムからのWin32 APIの呼び出し方について説明しているが、その呼び出し内部で何らかのエラーが発生した際には、そのエラーに関する情報はどうやって取得すればよいのだろうか。Win32 APIではエラーが発生したときに、「Win32エラー・コード」というエラー番号を取得できる。そこで本TIPSでは、.NETのプログラムからWin32 APIを呼び出した際に、Win32エラー・コードを取得する方法を説明する。

Win32エラー・コードを取得するには?

 Win32エラー・コードを取得するには、Marshalクラス(System.Runtime.InteropServices名前空間)の静的メソッドGetLastWin32Errorを使えばよい。このメソッドにはパラメータはない。戻り値はint/Integer型の数値で、これがWin32エラー・コードである。

 このMarshal.GetLastWin32Errorメソッドが使えるのは、呼び出すWin32 APIの定義で、DllImport属性(System.Runtime.InteropServices名前空間)のSetLastErrorフィールドに「true」が設定されている場合のみだ(デフォルトでは「false」)。

 次のコードは、Win32API(Beep関数)の定義でDllImport属性のSetLastErrorフィールドを設定している例である(DllImport属性の使い方については「TIPS:Win32 APIやDLL関数を呼び出すには?」を参考にしてほしい)。

[DllImport("kernel32.dll", SetLastError=true)]
private extern static bool Beep(uint dwFreq, uint dwDuration);
<DllImport("kernel32.dll", SetLastError := True)> _
Private Function Beep _
  (ByVal dwFreq As Integer, ByVal dwDuration As Integer) As Boolean
End Function
DllImport属性のSetLastErrorフィールドの設定(上:C#、下:VB)

 では、DllImport属性のSetLastErrorフィールドに「true」を設定したWin32 APIの呼び出しでエラーが発生した際に、Marshal.GetLastWin32Errorメソッドを呼び出してWin32エラー・コードを取得するサンプル・プログラムを次に示す。

using System;
using System.Runtime.InteropServices;

class BeepProgram
{
  [DllImport("kernel32.dll", SetLastError = true)]
  private extern static bool Beep(uint dwFreq, uint dwDuration);

  private static void Main()
  {
    bool ret = Beep(0x8000, 500);
    if (ret == false)
    {
      // エラーが発生
      int errCode = Marshal.GetLastWin32Error();
      Console.WriteLine("Win32エラー・コード:" +
        String.Format("{0:X8}", errCode));

      // 出力結果:
      // Win32エラー・コード:00000057
    }
  }
}
Imports System.Runtime.InteropServices

Module BeepProgram

  <DllImport("kernel32.dll", SetLastError:=True)> _
  Private Function Beep _
    (ByVal dwFreq As Integer, ByVal dwDuration As Integer) As Boolean
  End Function

  Sub Main()

    Dim ret As Boolean = Beep(&H8000, 500)
    If ret = False Then
      ' エラーが発生
      Dim errCode As Integer = Marshal.GetLastWin32Error()
      Console.WriteLine("Win32エラー・コード:" & _
        String.Format("{0:X8}", errCode))

      ' 出力結果:
      ' Win32エラー・コード:00000057
    End If

  End Sub

End Module
Win32エラー・コードを取得するサンプル・プログラム(上:C#、下:VB)

 太字の部分が「Win32エラー・コードを取得する」コードの部分だ。そのほかの部分のコードは特に難しい記述はないので詳細な説明は割愛する。Win32エラー・コード(数値)は、最終的に16進数の文字列としてコンソールに出力している(なお、数値を16進数の文字列にする方法については「TIPS:数値を右詰めや0埋めで文字列化するには?」を参照されたい)。

 Win32エラー・コードの中には、それに対応するエラー・メッセージが存在する場合がある。エンド・ユーザーにとって、コード番号だけではエラーの意味がよく分からないことが多いだろうが、エラー・メッセージを提示すればそれがエラーを解消する助けとなることもあるだろう。エラー・メッセージを取得する方法については、「TIPS:Win32エラー・コードからエラー・メッセージを取得するには?」で紹介する。End of Article

カテゴリ:クラス・ライブラリ 処理対象:Win32 API
使用ライブラリ:DllImport属性(System.Runtime.InteropServices名前空間)
使用ライブラリ:Marshalクラス(System.Runtime.InteropServices名前空間)
関連TIPS:Win32 APIやDLL関数を呼び出すには?
関連TIPS:Win32エラー・コードからエラー・メッセージを取得するには?
関連TIPS:数値を右詰めや0埋めで文字列化するには?

この記事と関連性の高い別の.NET TIPS
Win32エラー・コードからエラー・メッセージを取得するには?
Win32 APIやDLL関数を呼び出すには?
実行ファイルからアプリケーションのアイコンを取得するには?
Win32 API呼び出しを手軽に記述するには?
ドライブをフォーマットするためのダイアログを表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間