2007年10月16日火曜日

C#(マネージコード)でWin32APIのGetLastErrorに相当するもの b

PInvokeを使って,
[DllImport("kernel32.dll", EntryPoint="GetLastError")]
とか思ったりしちゃうけど,違うらしい.

MSDN blogを参考にすると,

1) GetLastError()によってエラー補足したいネイティブ関数は,DllImport時にSetLastError=trueをつけておく.

[DllImport("kernel32.dll", SetLastError=true, EntryPoint="foobar")]


2) LastErrorを補足するときは,Win32APIのGetLastError()関数を使うのではなく,マネージドコードである,Marshal.GetLastWin32Error()を使う.
Marshal.GetLastWin32Error()



以下は参考ページに記載されていたサンプル
using System.Runtime.InteropServices;

public class ForceFailure {
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool SetVolumeLabel(
string lpRootPathName,
string lpVolumeName
);

public static void Main() {
if (SetVolumeLabel("XYZ:\\", "My Imaginary Drive ")) {
System.Console.WriteLine("It worked???");
} else {
System.Console.WriteLine(Marshal.GetLastWin32Error());
}
}
}


SetVolumeLabel()というWin32APIを呼び出しているが,これは指定ドライブボリュームラベルを書き換えるAPIである.通常引数には書き換える対象となるドライブレター(例 C:\\)を入れるが,ここでは存在しない架空のXYZ:\\というドライブレターを指定しているので,当然この関数の実行は失敗し,エラーが発生する.
# おそらくエラーコード123が帰るはず


詳しい説明は引用元を参照のこと

0 件のコメント: