Problème avec la fonction RegQueryValueEx... en C

julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 - 5 juin 2008 à 16:39
slao Messages postés 3 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 15 juillet 2009 - 15 juil. 2009 à 15:25
Bonjour!

J'ai tenté d'utiliser la fonction RegQueryValueEx afin de récupérer la donnée d'une clés dans la base de registre Windows mais malgrès tout ce que j'ai trouvé comme information (y compris le site MSDN) je n'arrive pas à l'utiliser correctement!

La donnée que je veux récupérer doit ensuite être comparée à une autre que je fournis et si la donnée extraite de la base de registre ne correspond pas à celle que je donne alors je la remplace par la nouvelle (je vérifie en fait que la donnée soit bien à jour et si elle ne l'est pas je fais la mise à jour par un RegSetValueEx).

Voici la partie de mon code concernée par le problème :

char data[64], datatest[MAX_PATH] = ""; //data est la valeur que je renseigne et datatest est la donnée de la clés qui sera mise à jour si elle ne correspond pas à data
DWORD datatestsize;
HKEY valeur;
LPCTSTR subkey; //contient la subkey que je renseigne ailleur

RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT(subkey), 0, KEY_SET_VALUE, &valeur);
RegQueryValueEx (valeur, TEXT(valuename), 0, 0, (BYTE*)datatest, &datatestsize);
printf("Longueur de data       :  %i\n", strlen(data));
printf("Longueur de datatest   :  %i\n", strlen(datatest));
printf("Donnee de datatest     :  %s\n", &datatest);

La valeur de datatest récupérée est toujours NULL (donc "") et sa taille est donc de 0 alors que cela n'est pas le cas!

Mon compilateur ne me rapporte pas de warning ni d'erreurs donc je ne voit pas ce qui cloche!

Help s'il vous plait!!

1 réponse

slao Messages postés 3 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 15 juillet 2009
15 juil. 2009 à 15:25
Normal que ça ne fonctionne pas! je te conseille de relire attentivement la MSDN qui est claire à ce sujet. Et en gros ce qui ne va pas dans ton code:

1/ Applique un retour à tes méthodes, de cette façon tu aura une idée plus précise sur le pourquoi du non fonctionnement.
LONG lResult = !ERROR_SUCCESS;
lResult = RegOpenKeyEx ...
lResult &= RegQueryValueEx...

2/ Dans ton cas je suis presque sur que cela donnerait ERROR_MORE_DATA.
Et ce tout simplement parce que le dernier argument de RegQueryValueEx() est un argument de type in/out et vu que tu le renseigne par datatestsize sans lui donner de valeur, on peut supposer que cette variable vaut 0. Si bien que la méthode ne retourne rien etant donné qu'elle a pour argument "la taille du buffer max ou tu peux stocker la valeur lue vaut 0".
Pour résoudre ca fais :
datatestsize = sizeof(datatest);

3/ Le cast du troisième argument de RegQueryValueEx(): (BYTE*)datatest est très important, il doit refleter le type de la valeur lue, si c'est une chaine de type char stockée dans la base de registre via un champ binary, il ne faudra pas caster cet argument avec LPBYTE par exemple.

4/ Vérifies que TEXT(subkey) soit bien de la forme Comm\\E100\\Parms et non Comm\E100\Parms ou Comm/E100... enfin j'en passe
0
Rejoignez-nous