Je suis en train de configurer ReadFile
pour exécuter de manière asynchrone et selon MSDN, je dois mettre lpNumberOfBytesRead
à null
:Est-ce que IntPtr.Zero est équivalent à null?
« Utiliser NULL pour ce paramètre si cela est une opération asynchrone pour éviter des résultats potentiellement erronés. »
Par exemple, si je donne les résultats suivants:
[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
);
et je l'appelle comme ça (avec l'intention d'avoir le 4ème paramètre étant null):
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
volonté que être le même que l'appeler avec null? Si non, que dois-je changer dans la déclaration ou dans la fonction appeler elle-même?
J'étais aussi curieux de savoir si je devrais utiliser SafeHandle
ou HandleRef
au lieu de IntPtr
pour la référence hFile
? Je sais que je ferme la poignée avec CloseHandle(IntPtr)
quand j'en ai fini, mais je ne sais pas s'il y a une autre raison pour utiliser les deux autres options sur IntPtr
. Je tente également d'éviter d'utiliser un code dangereux.
EDIT: Comme il s'avère, je ne devrais pas mettre le quatrième paramètre à IntPtr.Zero
de toute façon, parce que même si je cours de manière asynchrone, il pourrait encore revenir tout de suite. Voir Asynchronous Disk I/O. Ahh, j'aime les histoires contradictoires.
Désolé pour le post-retour, mais ce n'est pas un bug car IntPtr.Zero n'est pas égal à null - de sorte que si la déclaration ne fonctionnerait pas. – Kobunite
@Kobunite Ensuite, essayez d'écrire 'if (IntPtr.Zero ==" Hello ")' et voyez ce qui se passe. Il y aura une erreur de compilation ... Le problème est qu'il n'y a aucun avertissement que la comparaison est impossible, et aucune erreur. Le code est simplement supprimé par le compilateur. Voir le code IL généré http://goo.gl/6zpPxN – xanatos
Désolé pour necro, mais il compile, car il utilise efficacement la surcharge de l'opérateur '==' cast implicite comme '(IntPtr?) IntPtr.Zero == (IntPtr?) null' – Marc