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 件のコメント:
コメントを投稿