WriteFile et Violation d'accès

Résolu
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008 - 23 août 2006 à 18:25
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 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

Apprendre le VB6
A voir également:

8 réponses

racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
23 août 2006 à 18:47
Salut,
DWORD a = 0;
WriteFile(hFile, "bou", 3, &a, NULL);
1
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
23 août 2006 à 18:49
Ca vient du 4ème paramètre. Tu passes un pointeur nul à WriteFile(). C'est donc normal d'avoir ce message.
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 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 ?

Merci d'avance

Apprendre le VB6
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
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)

_____________________________________
Un éditeur de ressources gratuit pour Windows
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 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.

Merci racpp

Apprendre le VB6
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
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.
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 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 ?

Apprendre le VB6
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
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.
0
Rejoignez-nous