Fonction en C RegQueryValueEx

Résolu/Fermé
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 - 5 juin 2008 à 13:50
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 - 9 juin 2008 à 09:10
Bonjour,
j'ai besoin de récupérer la valeur d'une certaine clés dans la base de registre pour la comparer avec une autre et ainsi si les valeurs ne sont pas les même alors celle de la base de registre est mise à jour. Le truc c'est que je ne parviens pas à utiliser correctement la fonction RegQueryValueEx().

Voici la partie de mon code qui l'utilise :
char datatest[24], data[24]; (data contient la valeur désirée pour la clés)
HKEY valeur;
LPCTSTR subkey, valuename; (subkey et valuename sont renseignés dans une autre partie de code)

RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT(subkey), 0, KEY_SET_VALUE, &valeur);
RegQueryValueEx (valeur, TEXT(valuename), 0, 0, datatest, strlen(datatest) + 1);
strcmp(datatest, data);

A la compilation, DevCPP 5 me dit :
[Warning] passing arg 6 of `RegQueryValueExA' makes pointer from integer without a cast

Je comprends pas...

Voici ce que dit MSDN sur la fonction utilisé :

RegQueryValueEx Function

Retrieves the type and data for the specified value name associated with an open registry key.

To ensure that any string values (REG_SZ, REG_MULTI_SZ, and REG_EXPAND_SZ) returned are null-terminated, use the RegGetValue function.
Syntax

LONG WINAPI RegQueryValueEx(
__in HKEY hKey,
__in_opt LPCTSTR lpValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_opt LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);

.......
https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexa?redirectedfrom=MSDN

Pouvez vous m'aider?

4 réponses

daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
5 juin 2008 à 14:32
remplace ton char data[24] par DWORD data=strlen(datatest); et dans la focntion tu mets :

RegQueryValueEx (valeur, TEXT(valuename), 0, 0, datatest, &data);

essaie voir et pense a tester la valeur de retour

tchû
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
5 juin 2008 à 15:04
Je ne veux pas toucher à data car cette variable ne me pose pas de problème.

C'est datatest qui me gêne car. Cette variable me sert de buffer pour stocker la valeur de la clés ouverte par RegOpenKeyEx afin de la comparer à data qui est la valeur voulu (que je renseigne à la main).

Le truc c'est que je ne comprends rien à la manière dont lpData et lpcbData fonctionne (précisons que lpData correspond à datatest et lpcbData à datatestsize dans mon prog)
lpData :
A pointer to a buffer that receives the value's data. This parameter can be NULL if the data is not required.
lpcbData :
A pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes. When the function returns, this variable contains the size of the data copied to lpData.

Pour moi qui suis noob en C je comprends pas cette utilisation de pointeur.

J'SUIS PERDU!!
Helppp!
0
daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
5 juin 2008 à 20:03
Warning] passing arg 6 of `RegQueryValueExA' makes pointer from integer without a cast

ceci signifie que le 6ieme argument qui chie, dans le sens où il attend un pointeur et pas une valeur (without a cast)


LONG WINAPI RegQueryValueEx(
__in HKEY hKey,
__in_opt LPCTSTR lpValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_opt LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);

on voit bien que le sixieme ici est lpcbData et donc le dernier parametre, et toi tu lui file une longueur alors qu'il attend un pointeur sur une variable de type DWORD ou int si tu preferes.

donc ...

ce DWORD correspond effectivement à la longueur de ton champ datatest comme je te l'ai indiqué

voilà en espérant t'avoir aider

tchû

NB: si tu suit (ou suis je ne sais plus) le raisonnement qui suit dans le lien que tu as mis tout a l'heure, il ne devrait pas y avoir de pb...
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
6 juin 2008 à 08:42
Je viens de créer les pointeurs vers les variables. Mais je rencontre les erreurs suivantes :
[Warning] assignment from incompatible pointer type
sur les lignes suivantes :

char name[64], hostname[64], domainname[64], ipv4[16], data[64], datatest[MAX_PATH] = "", *ptr_datatest;
ptr_datatest = &datatest;
int res, my_socket, envoie, hostname_flag = 0, flag = 0, c = 0, i, *ptr_datatestsize;
ptr_datatestsize = &datatestsize;

et aussi cette erreur:
[Warning] cast to pointer from integer of different size
sur cette ligne:
resultatquery = RegQueryValueEx (valeur, TEXT(valuename), 0, 0, (LPBYTE)*ptr_datatest, (LPDWORD)ptr_datatestsize);


Je commence tout juste le C et les pointeurs j'y comprends pas grand chose malgré ma bonne volonté....
0
daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
6 juin 2008 à 18:23
ce qu'il serait bien c'est d'avoir ton code car là tu le balance par petit morceau et bon je dois dire que je fais comme le compilo, je m'y perd ...

ne mets que les parties concernées si tu penses que ton code est confidentiel, sinon mets tout. après je regarde

merci

NB: pour ton code, selectionne le et clique sur le bouton "conserver la mise en forme du texte selectionné" ou alors utilise les mots clé "code" et "/code" entre chevron <> et sans les guillemets, en mettant avant ton code "code" et à la fin "/code" comme un balisage xml.
0
juanpablo Messages postés 142 Date d'inscription mercredi 30 mai 2007 Statut Membre Dernière intervention 16 juin 2008 10
6 juin 2008 à 18:55
bonsoir

pour (LPBYTE)*ptr_datatest
il faut (LPBYTE)ptr_datatest
mais datatest etant déja un pointeur sur char (LPBYTE)datatest suffirait


pour ptr_datatestsize = &datatestsize;
je ne vois pas la declaration datatestsize

de toute facon avec un type different de dword tu n'en feras pas grand chose
comme dit daronmaster le mieux est
DWORD datatestsize;
puis &datatestsize en 6e argument
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
9 juin 2008 à 09:10
Bon j'ai finis par y arriver, MSDN disait d'utiliser des pointeurs mais cela fonctionne aussi sans donc j'ai mis des variables directement et hop magie! Ca fonctionne!
0