[C++] Lire dans la base de registre : phénomène étonnant !!

Lire dans la base de registre : phénomène étonnant !! [C++] - C++ - Programmation

Marsh Posté le 29-08-2001 à 13:59:57    

Salut à tous !
 
J'ai de nouveau un ptit problème,  je ne comprends pas un truc, j'ai écrit le code suivant :
 
CDialog::OnInitDialog();
 
 long lResult; //Variable contenant le résultat du  RegQueryValue
 char IP[20]; //Définition de la variable contenant la valeur de la clé
 DWORD dwIPlen=20;
 
 CString IPAddressKey[10] = {"Software\\HubSoft\\IP1","Software\\HubSoft\\IP2",
 "Software\\HubSoft\\IP3","Software\\HubSoft\\IP4",
 "Software\\HubSoft\\IP5","Software\\HubSoft\\IP6",
 "Software\\HubSoft\\IP7","Software\\HubSoft\\IP8",
 "Software\\HubSoft\\IP9","Software\\HubSoft\\IP10"};
 
 CString IPAddressString[10];
 
 for (int i=0; i<10; i++)
 {
         lResult = RegQueryValue(HKEY_LOCAL_MACHINE, IPAddressKey[i], IP, (long*)&dwIPlen);
  IPAddressString[i]=IP;
 }
 
 m_strIPAddress1 = IPAddressString[0];
 m_strIPAddress2 = IPAddressString[1];
 m_strIPAddress3 = IPAddressString[2];
 m_strIPAddress4 = IPAddressString[3];
 m_strIPAddress5 = IPAddressString[4];
 m_strIPAddress6 = IPAddressString[5];
 m_strIPAddress7 = IPAddressString[6];
 m_strIPAddress8 = IPAddressString[7];
 m_strIPAddress9 = IPAddressString[8];
 m_strIPAddress10 = IPAddressString[9];
     
 //On met à jour le champ de chemin
 UpdateData(FALSE);
 
Et j'arrive presque à faire ce que je veux, à savoir, récupérer les valeurs de la base de registre pour les mettre dans le m_strIPAddressX...Tout fonctionne bien, excepté pour la dernière valeur !! A la fin de ce code, m_strIPAddress10 ne contient pas la bonne valeur, mais il contient celle de m_strIPAdress9...Comment cela se fait il ??
 
Merci d'avance à la personne qui pourra m'expliquer celà pour me permettre d'avancer...

Reply

Marsh Posté le 29-08-2001 à 13:59:57   

Reply

Marsh Posté le 29-08-2001 à 16:14:46    

Rebel a écrit a écrit :

Salut à tous !
 
J'ai de nouveau un ptit problème,  je ne comprends pas un truc, j'ai écrit le code suivant :
 
CDialog::OnInitDialog();
 
 long lResult; //Variable contenant le résultat du  RegQueryValue
 char IP[20]; //Définition de la variable contenant la valeur de la clé
 DWORD dwIPlen=20;
 
 CString IPAddressKey[10] = {"Software\\HubSoft\\IP1","Software\\HubSoft\\IP2",
 "Software\\HubSoft\\IP3","Software\\HubSoft\\IP4",
 "Software\\HubSoft\\IP5","Software\\HubSoft\\IP6",
 "Software\\HubSoft\\IP7","Software\\HubSoft\\IP8",
 "Software\\HubSoft\\IP9","Software\\HubSoft\\IP10"};
 
 CString IPAddressString[10];
 
 for (int i=0; i<10; i++)
 {
         lResult = RegQueryValue(HKEY_LOCAL_MACHINE, IPAddressKey[i], IP, (long*)&dwIPlen);
  IPAddressString[i]=IP;
 }
 
 m_strIPAddress1 = IPAddressString[0];
 m_strIPAddress2 = IPAddressString[1];
 m_strIPAddress3 = IPAddressString[2];
 m_strIPAddress4 = IPAddressString[3];
 m_strIPAddress5 = IPAddressString[4];
 m_strIPAddress6 = IPAddressString[5];
 m_strIPAddress7 = IPAddressString[6];
 m_strIPAddress8 = IPAddressString[7];
 m_strIPAddress9 = IPAddressString[8];
 m_strIPAddress10 = IPAddressString[9];
     
 //On met à jour le champ de chemin
 UpdateData(FALSE);
 
Et j'arrive presque à faire ce que je veux, à savoir, récupérer les valeurs de la base de registre pour les mettre dans le m_strIPAddressX...Tout fonctionne bien, excepté pour la dernière valeur !! A la fin de ce code, m_strIPAddress10 ne contient pas la bonne valeur, mais il contient celle de m_strIPAdress9...Comment cela se fait il ??
 
Merci d'avance à la personne qui pourra m'expliquer celà pour me permettre d'avancer...  




 
et si tu en lisais 11?  ;)

Reply

Marsh Posté le 29-08-2001 à 22:25:15    

Ouais, j'ai essayé ca fait pareil...
Appremment, c'est parce que c'est une adresse du type "xx.xx.xx.xx" qui est stockée, alors que dans les autres champs c'est une adresse du style "x.x.x.x"...Ne serait-ce pas un problème de mémoire ?
Aller, y'a bien un pro du C++ qui peut me filer un coup de main ??? :)

Reply

Marsh Posté le 30-08-2001 à 10:11:33    

Rebel a écrit a écrit :

Ouais, j'ai essayé ca fait pareil...
Appremment, c'est parce que c'est une adresse du type "xx.xx.xx.xx" qui est stockée, alors que dans les autres champs c'est une adresse du style "x.x.x.x"...Ne serait-ce pas un problème de mémoire ?
Aller, y'a bien un pro du C++ qui peut me filer un coup de main ??? :)  




 
qu'entends tu par xx ou x?
 
1.2.3.4  c x.x.x.x ?
11.22.33.44 c xx.xx.xx.xx ?

Reply

Marsh Posté le 30-08-2001 à 10:35:12    

J'ai pas de solution, mais RegQueryvalue est une fonction obsolete : Il vaut mieux utiliser RegQueryValueEx.
Voir :
http://www.silurian.com/gawp/gotw/reg1/REGQV.htm
http://www.silurian.com/gawp/gotw/reg1/REGQVE.htm
http://www.silurian.com/gawp/gotw/reg1/REGsQ1.htm
 
A+

Reply

Marsh Posté le 30-08-2001 à 22:25:52    

therier a écrit a écrit :

 
 
qu'entends tu par xx ou x?
 
1.2.3.4  c x.x.x.x ?
11.22.33.44 c xx.xx.xx.xx ?  




 
Effectivement, c'est ça que j'entends avec les xx et les x.
Mais finalement je crois que je vais pas faire une boucle et que je vais appeler la fonction à chaque fois...

Reply

Marsh Posté le 30-08-2001 à 22:34:27    

JPA a écrit a écrit :

J'ai pas de solution, mais RegQueryvalue est une fonction obsolete : Il vaut mieux utiliser RegQueryValueEx.
Voir :
http://www.silurian.com/gawp/gotw/reg1/REGQV.htm
http://www.silurian.com/gawp/gotw/reg1/REGQVE.htm
http://www.silurian.com/gawp/gotw/reg1/REGsQ1.htm
 
A+  




 
Merci beacoup pour les liens je connaissais pas ce truc pour avoir les exemples en temps réel, c'est super chouette !!! :sol:

Reply

Marsh Posté le 31-08-2001 à 03:07:59    

en fait .. ce qu'il se passe surement .. c que ton programme n'arrive pas à lire ton ip 10 et comme dans le buffer que tu utilises pour stocker tes ip (IP) il y a la valeur precedente, c celle ci qui est copier dans le tableau pour l'IP10.
je c pas si c comprehensible. enfin
 
IPAddressString[9]=IP;
retour au debut IP ne change pas de valeur car la cle n'est pas trouvée.
IPAddressString[10]=IP=IPAddressString[9]

Reply

Marsh Posté le 01-09-2001 à 00:17:41    

J'ai essayé en mettant un buffer différent pour chaque IP...et bien, ça ne marche pas non plus !!! D'autres idées ? Aidez-moi s'il vous plaît parce que là, ça devient vraiment ennuyeux !! :crazy:

Reply

Marsh Posté le 01-09-2001 à 01:19:03    

Rebel a écrit a écrit :

J'ai essayé en mettant un buffer différent pour chaque IP...et bien, ça ne marche pas non plus !!! D'autres idées ? Aidez-moi s'il vous plaît parce que là, ça devient vraiment ennuyeux !! :crazy:  




 
la viper t'a je pense donné la solution, regarde si ta 10e entrée existe.

Reply

Marsh Posté le 01-09-2001 à 01:19:03   

Reply

Marsh Posté le 01-09-2001 à 11:18:43    

j'ai +/- le meme probleme avec mon appli ..
 
je lis la clé a-b-e-f-g-h-i... elles renvoient toutes un resultat sauf le g qui ne veut absolumenent pas me rendre sa valeur .. ca se trouve tu as le meme genre de probleme... moi j'ai laissé l'affaire.

Reply

Marsh Posté le 01-09-2001 à 12:04:25    

Oui, mais moi, je peux pas lâcher, je dois absolument faire marcher ce machin...je suis pas du style à abandonné !!! Et en plus, j'ai pas d'autre solution, alors...
 
Ayachi > Non, il ne m'a pas donné la solution, j'ai bien une 10ème valeur, et il n'arrive pas à la lire !

Reply

Marsh Posté le 01-09-2001 à 13:24:29    

Rebel a écrit a écrit :

Oui, mais moi, je peux pas lâcher, je dois absolument faire marcher ce machin...je suis pas du style à abandonné !!! Et en plus, j'ai pas d'autre solution, alors...
 
Ayachi > Non, il ne m'a pas donné la solution, j'ai bien une 10ème valeur, et il n'arrive pas à la lire !  




 
mailes-moi tes données du registre sous HubSoft, je vais essayer chez moi.

Reply

Marsh Posté le 02-09-2001 à 11:12:19    

Merci de ton aide : Check your mail ! :sol:

Reply

Marsh Posté le 02-09-2001 à 13:33:54    

Rebel a écrit a écrit :

Merci de ton aide : Check your mail ! :sol:  




 
reçu, je fais les essais aujourd'hui.

Reply

Marsh Posté le 02-09-2001 à 14:56:00    

Bon ok, je pense avoir trouvé.
Bon le problème, tu remarques que IP10 est avant IP9 dans le .reg que tu m'as envoyé, il est en deuxième position d'ailleurs. Quand tu lis la base de registre, tu le fais séquentiellement donc si tu dépasses une clé, tu ne peux plus la lire, du moins avec ton code. ça fonctionne comme un curseur. Si tu debug tu verras que quand i=9, regqueryvalue retourne une erreur et donc IP n'est pas modifé et contient la dernière bonne valeur lue ie IP9.
Donc il faut se repositionner avant de lire. J'ai vu ça dès que j'ai regardé ton .reg.
La solution, il faut utiliser le trio RegOpenKeyEx, RegQueryValueEx, RegCloseKey.
Voici le code qui marche du moins chez moi, fais un copier coller
 
CDialog: nInitDialog();
 
long lResult; //Variable contenant le résultat du  RegQueryValue
char IP[20]; //Définition de la variable contenant la valeur de la clé
DWORD dwIPlen=20;
DWORD dwKeyType; // ne pas l'oublier
HKEY Key;
 
CString IPAddressKey[10] = {"Software\\HubSoft\\IP1","Software\\HubS
 
 
oft\\IP2",
"Software\\HubSoft\\IP3","Software\\HubSo
 
 
ft\\IP4",
"Software\\HubSoft\\IP5","Software\\HubSo
 
 
ft\\IP6",
"Software\\HubSoft\\IP7","Software\\HubSo
 
 
ft\\IP8",
"Software\\HubSoft\\IP9","Software\\HubSo
 
 
ft\\IP10"};
 
CString IPAddressString[10];
 
for (int i=0; i<10; i++)
{
 dwIPlen = 20;
 RegOpenKeyEx( HKEY_LOCAL_MACHINE, IPAddressKey[i], 0, KEY_READ, &Key );
 lResult = RegQueryValueEx( Key, "", 0, &Dw, (LPBYTE) IP, (LPDWORD) &dwIPlen );
 IPAddressString[i]=IP;
 RegCloseKey( Key );
}
 
m_strIPAddress1 = IPAddressString[0];
m_strIPAddress2 = IPAddressString[1];
m_strIPAddress3 = IPAddressString[2];
m_strIPAddress4 = IPAddressString[3];
m_strIPAddress5 = IPAddressString[4];
m_strIPAddress6 = IPAddressString[5];
m_strIPAddress7 = IPAddressString[6];
m_strIPAddress8 = IPAddressString[7];
m_strIPAddress9 = IPAddressString[8];
m_strIPAddress10 = IPAddressString[9];
   
//On met à jour le champ de chemin
UpdateData(FALSE);
 
PS il peut y avoir des erreurs, ça fait longtemps que j'ai pu toucher à la base des registres, la dernière fois c'était pour faire des fonctions de recherche générique dessus.

 

[edtdd]--Message édité par ayachi--[/edtdd]

Reply

Marsh Posté le 02-09-2001 à 15:08:24    

ah oui j'ai fait des tests en mode console, donc ce code je ne l'ai pas fait fonctionner mais il DEVRAIT fonctionner.

Reply

Marsh Posté le 02-09-2001 à 22:22:34    

Merci beacoup de ton aide ayachi !!! Et check your mail again ;-)

Reply

Marsh Posté le 03-09-2001 à 23:13:24    

Effectivement ca marche !!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed