I am trying to setup ReadFile
to run asynchronously and according to MSDN, I need to set lpNumberOfBytesRead
to null
:
"Use NULL for this parameter if this is an asynchronous operation to avoid potentially erroneous results."
For example, if I have the following:
[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 );
and I call it like this (with the intention of having the 4th parameter being null):
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
will that be the same as calling it with null? If not, what should I change in the declaration or in the function call itself?
I was also curious if I should be using SafeHandle
or HandleRef
instead of IntPtr
for the hFile
reference? I know to make sure that I close the handle with CloseHandle(IntPtr)
when I'm done with it, just not sure if there is any othe reason to use the other two options over IntPtr
. I am also tryingn to avoid using unsafe code.
EDIT: As it turns out, I shouldnt be setting the fourth parameter to IntPtr.Zero
anyway, because even though I am running asynchronously, it could still return right away. See Asynchronous Disk I/O. Ahh, I love contradicting stories.
IntPtr is a value type and cannot be null.
The IntPtr type can be used by languages that support pointers and as a common means of referring to data between languages that do and do not support pointers. IntPtr objects can also be used to hold handles. For example, instances of IntPtr are used extensively in the System. IO.
For P/Invoke purposes like you've listed, you should use IntPtr.Zero
in place of NULL
. Note that this is not equivalent to the C# null
keyword, however.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With