Estoy intentando fijar ReadFile
para funcionar de forma asíncrona y de acuerdo con MSDN, tengo que configurar lpNumberOfBytesRead
a null
:¿IntPtr.Zero es equivalente a nulo?
"Usar NULL para este parámetro si se trata de una operación asincrónica para evitar resultados potencialmente erróneas."
Por ejemplo, si tengo el siguiente:
[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
);
y yo lo llamo así (con la intención de tener el cuarto parámetro es nulo):
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
voluntad que ser lo mismo que llamarlo con nulo? Si no, ¿qué debería cambiar en la declaración o en la llamada a la función en sí?
También era curioso si que debería usar SafeHandle
o HandleRef
en lugar de IntPtr
para la referencia hFile
? Sé que debo asegurarme de cerrar el identificador con CloseHandle(IntPtr)
cuando termine con él, pero no estoy seguro si hay alguna otra razón para usar las otras dos opciones sobre IntPtr
. También estoy tratando de evitar el uso de código inseguro.
EDITAR: Resulta que, de todos modos, no debería establecer el cuarto parámetro en IntPtr.Zero
, porque aunque estoy ejecutando de forma asíncrona, podría volverse de inmediato. Ver Asynchronous Disk I/O. Ahh, amo historias contradictorias.
Lo siento por la publicación posterior, pero eso no es un error ya que IntPtr.Zero no es igual a nulo, por lo que si la declaración no funcionara. – Kobunite
@Kobunite Luego intente escribir 'if (IntPtr.Zero ==" Hello ")' y vea qué sucede. Habrá un error en tiempo de compilación ... El problema es que no hay advertencia de que la comparación es imposible y no hay error. El código simplemente lo elimina el compilador. Ver el código IL generado http://goo.gl/6zpPxN – xanatos
Lo siento por necro, pero se compila porque está utilizando efectivamente la sobrecarga del operador '==' al reparto implícito como '(IntPtr?) IntPtr.Zero == (IntPtr?) null' – Marc