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
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
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
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û
RegQueryValueEx (valeur, TEXT(valuename), 0, 0, datatest, &data);
essaie voir et pense a tester la valeur de retour
tchû
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
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...
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...
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
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é....
[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é....
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
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.
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.
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
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
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
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
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!
5 juin 2008 à 15:04
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!