私はReadFile
非同期で実行するように設定しようとしており、マイクロソフト、lpNumberOfBytesRead
次のように設定する必要がありますnull
:
「非同期操作の場合は、誤った結果が発生する可能性を回避するために、このパラメータに NULL を使用します。」
たとえば、次のような場合です。
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool ReadFile(
IntPtr hFile,
out byte[] aBuffer,
int cbToRead,
IntPtr cbThatWereRead,
ref OVERLAPPED pOverlapped
);
そして、私はこれを次のように呼び出します (4 番目のパラメータを null にすることを意図しています)。
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
それは null で呼び出すのと同じでしょうか? そうでない場合、宣言または関数呼び出し自体で何を変更する必要がありますか?
また、参照にの代わりにSafeHandle
または を使用すべきかどうかも気になります。使用後はでハンドルを閉じることを確実にすることはわかっていますが、 ではなく他の 2 つのオプションを使用する他の理由があるかどうかはわかりません。 また、安全でないコードの使用は避けようとしています。HandleRef
IntPtr
hFile
CloseHandle(IntPtr)
IntPtr
編集: 結局のところ、4番目のパラメータを に設定すIntPtr.Zero
べきではありません。非同期で実行しているにもかかわらず、すぐに返される可能性があるからです。非同期ディスクI/Oああ、矛盾した話は大好きです。
ベストアンサー1
あなたが挙げたような P/Invoke の目的の場合、IntPtr.Zero
の代わりにを使用する必要があります。ただし、NULL
これは C# キーワードと同等ではないことに注意してください。null