WriteFile et Violation d'accès [Résolu]

Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention - 23 août 2006 à 18:25 - Dernière réponse : racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 23 août 2006 à 18:47
1
Merci
Salut,
DWORD a = 0;
WriteFile(hFile, "bou", 3, &a, NULL);

Merci racpp 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de racpp
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 23 août 2006 à 18:49
0
Merci
Ca vient du 4ème paramètre. Tu passes un pointeur nul à WriteFile(). C'est donc normal d'avoir ce message.
Commenter la réponse de racpp
Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention - 23 août 2006 à 18:52
0
Merci
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
Commenter la réponse de Ziman
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 23 août 2006 à 18:59
0
Merci
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
Commenter la réponse de vecchio56
Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention - 23 août 2006 à 19:02
0
Merci
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
Commenter la réponse de Ziman
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 23 août 2006 à 19:11
0
Merci
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.
Commenter la réponse de racpp
Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention - 23 août 2006 à 22:04
0
Merci
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
Commenter la réponse de Ziman
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 24 août 2006 à 03:53
0
Merci
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.
Commenter la réponse de racpp

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.