Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008
-
23 août 2006 à 18:25
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 2014
-
24 août 2006 à 03:53
Bonjour à tous,
je regarde un peu les API pour les fichiers. Voici mon code :
File = CreateFile("C:\\a.txt",
FILE_ALL_ACCESS,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL); // Crée le fichier
LPDWORD a = 0;
WriteFile(hFile, "bou", 3, a, NULL);
CloseHandle(hFile);
J'essaye juste d'écrire bou dans le fichier histoire de voir et en fait ça fonctionne, mais Visual C++ m'afficher un message d'erreur :
Exception non gérée à 0x77e864cd dans TXT.exe:0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x00000000.
Quelqu'un peut me dire d'ou ca vient ? j'ai cru lire que ca venait du troisième paramètre de CreateFile mais bon j'autorise le partage en écriture et lecture donc je ne comprend pas
Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008 23 août 2006 à 18:52
Quand je met le "&", il me dit que le type de donnée n'est pas bon. Ensuite sous MSDN j'ai vu ceci :
* lpNumberOfBytesWritten : [out]
Pointer to the variable that receives the number of bytes written.
WriteFile sets this value to zero before doing any work or error checking.
Donc apparement il serait initiliasé par la fonction par le nombre d'octet écrit dans le fichier. Et c'est deja un pointeur vu son style (LPDWORD). Bref j'ai essayé ta solution et ca ne fonctionne pas. Une autre idée ?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 23 août 2006 à 18:59
Il faut passer un pointeur valide (le tien vaut NULL, et ne pointe don nulle part. Ou WriteFile va-t-il pouvoir écrire sa valeur?)
Avant de dire que racpp à tort, tu pourrais au moins essayer sa solution (qui est bonne c'est sue et certain)
Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008 23 août 2006 à 19:02
Bon ... Je n'ai pas dit que racpp avait tord, loin de là, j'ai essayé sa solution mais je n'avais pas preté attention au fait qu'il avait changé le type de la variable. Toute mes excuses, cela fonctionne.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 23 août 2006 à 19:11
Ziman >> La programmation en C/C++ demande beaucoup de rigueur. Il ne faut jamais faire les choses trop vite. Avec le temps tu auras ce sens de la rigueur. Et ça aide aussi beaucoup dans la vie en général.
Ziman
Messages postés245Date d'inscriptiondimanche 27 avril 2003StatutMembreDernière intervention26 septembre 2008 23 août 2006 à 22:04
D'accord, mais j'aurais une autre tite question justement sur ca.
La fonction recquiert un LPDWORD. Pourquoi est-ce que ca ne fonctionne pas directement quand j'envoie un LPDWORD ? Pourquoi faut-il passer l'adresse d'un DWORD ?
Un LPDWORD ne contient pas une adresse lorsqu'on le déclare ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 24 août 2006 à 03:53
LPDWORD signifie pointeur sur DWORD.
Avec LPDWORD on ne fait que déclarer le type de variable (pointeur sur DWORD). Avant de l'utiliser, il faut que ce pointeur soit correctement initialisé. Pour simplifier, un pointeur est une case mémoire contenant l'adresse d'une autre case mémoire. On peut dire qu'il pointe vers une autre case mémoire. Ce pointeur doit donc contenir une adresse valide. Quand tu fais LPDWORD a=0; ça veut dire que ton pointeur contient l'adresse 0 qui n'est pas une adresse valide. WriteFile() a besoin de connaitre l'adresse d'un DWORD pour y mettre le nombre d'octets écrits. Son 4ème paramètre est donc un pointeur sur notre DWORD (d'où le LPDWORD). Si on veut passer l'adresse d'une variable à une fonction directement, on fait précéder le nom de la variable par le symbole "&". Voilà, j'espère que c'est assez clair.
DWORD b=0;
LPDWORD a=&b;
Dans cet exemple, notre pointeur a est bien initialisé car il contient l'adresse de la variable b.