|
.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エラー・コードからエラー・メッセージを取得するには?」で紹介する。
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間