Erreur 1784 Problème ReadFile [Résolu]

Messages postés
13
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
21 juin 2007
- - Dernière réponse : vecchio56
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
- 21 août 2006 à 16:03
Bonjour, (le nom un peu compliqué du sujet est pour les recherches, parce que j'aimerai bien que tous les titres soient précis ( "j'ai un probleme" c pas sympa comme titre de thread ^^ ) )

Résumé du problème : Mon ReadFile renvoit false quand mon Handle (qui est bon) est sur un périphérique USB, je n'ai pas le problème en Visual Basic.

Le problème en détail
Je rencontre un petit problème avec un ReadFile.
Dans un premier cas j'ouvre un Handle sur un port virtuel "COM6" et je communique via ce port avec un hardware distant (par bluetooth) et avec le ReadFile suivant tout se passe bien :

h = CreateFile("COM6",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
(...)
if(ReadFile(h,data,3,&nbRead, NULL)){...}


dans mon deuxieme cas j'ouvre un handle sur un periphérique USB; le handle marche correctement, (grace au fonction fournit par la bibliotheque hid.dll je peux le vérifier aisément (ca communique :D ) ) mais le ReadFile me renvoit false. Avec la meme structure que précédemment :

h = CreateFile(FunctionClassDeviceData.DevicePath,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
// FunctionClassDeviceData.DevicePath correspond au chemin d'acces a l'USB, et cette ligne marche :)
(...)
if(ReadFile(h,data,3,&nbRead, NULL)){...}


Je cherche donc à résoudre ce problème, sachant que cela fonctionne en VB :
OpenForRead = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READWRITE, SA, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
OpenForWrite = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READWRITE, SA, OPEN_EXISTING, 0, 0);
(...)
Success = ReadFile(ReadHandle_USB, Buffer, Count, BytesRead, ReadOverlap)


L'erreur récupérée apres le le createFile est l'erreur 1784:
> Error: 1784 The supplied user buffer is not valid for the requested operation.

La définition des paramètres, (incluant mon buffer) :
    BYTE data[1600];
    DWORD nbRead = 0;


Apres des recherches Google :
Windows me dit ca : [url]http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q259573/url
Je sais c pas si il y a un lien, et y en aurait un , j'ai pas bien compris comment mettre en place leur solution.

Si tout cela dit qqchose à qqun ?

--- Ne prenez pas le vie trop au sérieux, de toutes manières vous n'y survivrez pas ---
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
3
Merci
Peut être que la taille 3 n'est pas valide pour lecture
Par exemple quand on ouvre un disque dur avec ReadFile, il faut lire par bloc de 512o (ou multiple)

Pourquoi tu ne "copie" pas tel quel le code VB? (je veux dire, le flag FILE_FLAG_OVERLAPPED par exemple a disparu...)

_____________________________________
Un éditeur de ressources gratuit pour Windows

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 207 internautes nous ont dit merci ce mois-ci

Commenter la réponse de vecchio56
Messages postés
13
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
21 juin 2007
2
3
Merci
Pour faire une jolie réponse :

L'erreur 1784 sur un readfile peut etre du à cause d'une longueur de donnée à lire et d'un buffer mal dimmensionné.

Pour mon exemple, ca ne marche que si mon nombre de donnée lue est de 65 octet (la taille de ma tram) et que mon buffer est de taille supérieur.

J'utilise Data[64] et 65 en lecture bit.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 207 internautes nous ont dit merci ce mois-ci

Commenter la réponse de usbeck
Messages postés
13
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
21 juin 2007
2
0
Merci
Edit : Mise en page :) pas de bbCode : D

Bonjour, (le nom un peu compliqué du sujet est pour les recherches,
parce que j'aimerai bien que tous les titres soient précis ( "j'ai un
probleme" c pas sympa comme titre de thread ^^ ) )

Résumé
du problème : Mon ReadFile renvoit false quand mon Handle (qui est
bon) est sur un périphérique USB, je n'ai pas le problème en Visual
Basic.

Le problème en détail
Je rencontre un petit problème avec un ReadFile.
Dans
un premier cas j'ouvre un Handle sur un port virtuel "COM6" et je
communique via ce port avec un hardware distant (par bluetooth) et avec
le ReadFile suivant tout se passe bien :

h = CreateFile("COM6",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
(...)
if(ReadFile(h,data,3,&nbRead, NULL)){...}

dans
mon deuxieme cas j'ouvre un handle sur un periphérique USB; le handle
marche correctement, (grace au fonction fournit par la bibliotheque
hid.dll je peux le vérifier aisément (ca communique :D ) ) mais le
ReadFile me renvoit false. Avec la meme structure que précédemment :

h = CreateFile(FunctionClassDeviceData.DevicePath,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
// FunctionClassDeviceData.DevicePath correspond au chemin d'acces a l'USB, et cette ligne marche :)
(...)
if(ReadFile(h,data,3,&nbRead, NULL)){...}

Je cherche donc à résoudre ce problème, sachant que cela fonctionne en VB :
OpenForRead = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READWRITE, SA, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
OpenForWrite = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READWRITE, SA, OPEN_EXISTING, 0, 0);
(...)
Success = ReadFile(ReadHandle_USB, Buffer, Count, BytesRead, ReadOverlap)

L'erreur récupérée apres le le createFile est l'erreur 1784:
> Error: 1784 The supplied user buffer is not valid for the requested operation.

La définition des paramètres, (incluant mon buffer) :
BYTE data[1600];
DWORD nbRead = 0;

Apres des recherches Google :
Windows me dit ca : http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q259573
Je sais c pas si il y a un lien, et y en aurait un , j'ai pas bien compris comment mettre en place leur solution.

Si tout cela dit qqchose à qqun ?

--- Ne prenez pas le vie trop au sérieux, de toutes manières vous n'y survivrez pas ---
Commenter la réponse de usbeck
Messages postés
13
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
21 juin 2007
2
0
Merci
CA MARCHE !!!!! OMG j'en pleure, ca fait ... plus de 2 semaines que je suis la dessus et que j'avance tout petit à petit et la ca marche :'(

C'est vrai qu'il aurait pu etre plus futé de ma part de prendre directement les tailles de buffer et de lecture lu comme dans le Code VB et c BON !!!!!

Meme si ton aide peut te paraitre minime, elle fut immense MERCI BEAUCOUP BEAUCOUP !!!!!!
Commenter la réponse de usbeck
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Si tu veux lire 65 octets, il est plus sage d'en réserver 65
Si tu ne réserves que 64 il y aura dépassement du tableau

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56