Erreur 1784 Problème ReadFile

Résolu
usbeck Messages postés 13 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 21 juin 2007 - 21 août 2006 à 09:26
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre 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 ---

5 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
21 août 2006 à 14:46
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
3
usbeck Messages postés 13 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 21 juin 2007 2
21 août 2006 à 16:00
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.
3
usbeck Messages postés 13 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 21 juin 2007 2
21 août 2006 à 11:25
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 ---
0
usbeck Messages postés 13 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 21 juin 2007 2
21 août 2006 à 15:58
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 !!!!!!
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
21 août 2006 à 16:03
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
0
Rejoignez-nous