julow
Messages postés2198Date d'inscriptiondimanche 26 août 2007StatutMembreDernière intervention 7 juillet 2015
-
5 juin 2008 à 16:39
slao
Messages postés3Date d'inscriptionvendredi 8 septembre 2006StatutMembreDernière intervention15 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!
slao
Messages postés3Date d'inscriptionvendredi 8 septembre 2006StatutMembreDernière intervention15 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