ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

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が帰るはず


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

2007年6月6日水曜日

C#でBASIC認証越しにXMLデータを取得する b

C#でXMLデータを読み込む方法はいくつかあるが,
たいていどのクラスでもURLをStringで渡せばそれを読み込みにいってくれる.
だが,閲覧にBASIC認証が必要なXMLファイルを読むにはどうすればいいか?

Microsoftのページに普通に書いてあった.

NetworkCredential nc = new NetworkCredential("id", "pass");
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = nc;

XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;

XmlReader reader = XmlReader.Create("http://my.domain/hoge.xml", settings);


こんな感じであとはXmlReaderのオブジェクトをXmlDocumentなりのパーサに渡せる.
ちなみにNetworkCredentialクラスは,他にも様々な認証に対応しているらしい.