FORUM Tom's Hardware » Programmation » C / C++ / Java » Modification de la base de registre
 

Modification de la base de registre

Il y a 362 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : Modification de la base de registre
 
Plus d'informations

Bonjour à toutes et à tous,

Je suis en stage, et je dois faire un programme qui permet la modification d'une clé dans la base de registre, car un simple .reg ne suffis pas. Le problème est que le chemin pour arriver jusqu'a cette clé est différent en fonction du profil utilisateur...

Il faut donc que je fasse un programme en C++ pour modifier la base de registre.
Le chemin est le suivant:
Poste de travail/HKEY_CURRENT_USER/Software/Funk Software, Inc./Odyssey/client/profiles/profiles#XXXX/authentification/
et dedans, on y trouve la clé: "primaryEAP"
XXXX étant une chaine qui varie suivant le profil.

j'avais pensé me placer sur le chemin : "Poste de travail/HKEY_CURRENT_USER/Software/Funk Software, Inc./Odyssey/client/profiles" et faire la manipulation pour à tous les profils existant.

J'ai un lien vers l'API Windows, mais je ne sais pas par où commencer.

Je cherche de quoi modifier le chemain courant pour arriver à ma clé, la valeur de la clé et toutes autres informations qui pourraient être utile...

Merci de votre aide.

zeb
Profil : Modérateur libre
Plus d'informations

As-tu déjà un bout de code à soumettre à critique ?

Plus d'informations

Ba nan, pas vraiment... :s Pour ma défense, j'ai pas encore eu de quoi me mettre à coder (ça arrivera lundi), et le bloc note ne me disait rien...
par contre, j'ai commencé a cherché;

Je dois créer mon objet pour pouvoir manipuler la base de registre,

TRegistry *registre = new TRegistry();

Et après, avant d'accéder à la clé, il faut en spécifier la clé racine dans le registre:

registre->RootKey = HKEY_CLASSES_ROOT;

Au lieu d'affecter HKEY_CLASSES_ROOT est-ce que je peux mettre une chaine de caractère, à savoir ici en l'occurence:
"/HKEY_CURRENT_USER/Software/Funk Software, Inc./Odyssey/client/profiles" ?

Ou est-ce qu'il est d'abord conseillé de vérifier l'existance de chaque clé? (Bien qu'en théorie, ces clés devraient exister puisque que le client Odyssey est installé sur tous les portables.)

G.M.G.V.S.O.
Profil : Modo matériel
Plus d'informations

Fait ça propre, donc ne supputes rien et verifie tout :)

zeb
Profil : Modérateur libre
Plus d'informations

Tu utilises une classe toute faite, TRegistry. Il faut donc te plier à sa façon de faire.
--> RTFM.

Donc non, tu ne dois pas ajouter HKEY_XXXX au chemin, mais d'abord le mettre dans RootKey.
Utilise la méthode OpenKeyReadOnly avec le chemin complet (Software/.../profiles), et vérifie que la clef est bien ouverte.

Si la clef n'est pas ouverte, tu peux en conclure que le logiciel n'est pas installé et quitter.

Plus d'informations

ok, merci pour les infos, je teste ça ^^

Plus d'informations

bon, j'ai commençais, mais j'avais une question par rapport à l'OpenKeyReadOnly()
si j'ai une string, auquel j'affecte le chemin de ma clé, est-ce que ça peut marcher ou alors il faut un type spécial?
String tmp = "Software/Funk Software, Inc./Odyssey/client/profiles";
registre->OpenKeyReadOnly(tmp);
parce qu'après, ce que je voudrais, c'est ajouter à ma chaine le nom de la 1er clé faire mon traitement cad:
aller dans profiles#XXXX/authentification/
et changer ma clé "primaryEAP"
puis retourner dans le dossier précédent profiles#XXXX et passer au second dossier s'il existe.
alors est ce qu'il y a une méthode pour dire de retourner au dossier parent ou alors c'est pas utile que je cherche?

zeb
Profil : Modérateur libre
Plus d'informations

Il faut que tu lises la doc. de TRegistry !

Tu y apprendras que tu ne peux ouvrir qu'une clef à la fois et qu'il n'y a pas de "navigation" possible, genre "aller au précédent".

Plus d'informations

Voici mon code:

Code :
  1. TRegistry *registre = new TRegistry();
  2. TStringList *Liste = new TStringList();
  3. int taille;
  4. AnsiString Chaine, tmp, chemin,ajout;
  5. try
  6. {
  7.         //on se place dans la racine 'HKEY_CURRENT_USER'
  8.         registre->RootKey = HKEY_CURRENT_USER;
  9. }
  10. __finally
  11. {
  12.         delete registre;
  13. }
  14. chemin="SOFTWARE/Funk Software, Inc./Odyssey/client/profiles";
  15. ajout="/authentification";
  16. //on regarde si la clé jusqu'au profiles existe
  17. if(registre->OpenKeyReadOnly(chemin))
  18. {
  19.         registre->GetKeyNames(Liste);
  20.         taille = Liste->Count;
  21.         for(int i=0; i<taille;i++)
  22.     {
  23.             // On recupère la 1er valeur de la liste.
  24.                 Chaine = Liste->Strings[i];
  25.                 //on concatène tout pour aller jusqu'au chemin voulu!
  26.                 tmp=chemin+"/"+Chaine;    //+ajout;
  27.                 //Est-ce qu'il faut fermer la clé avant de lui
  28.                 //affecter une nouvelle valeur?
  29.                 if(registre->OpenKeyReadOnly(tmp))
  30.                 {
  31.                     //Voir quelle clé il faut ouvrir
  32.                         //s'il faut ouvrir authentification et                         
  33.             //ouvrir "primary EAP" ou s'il faut ouvrir                     
  34.             //seulement "primary EAP"
  35.                 registre->OpenKey("authentification",false);
  36.                 registre->WriteString("primary EAP", "PEAP" );
  37.                 }
  38.         }
  39.         //Ferme et supprime la clé 'registre'
  40.         delete registre;
  41.         delete Liste;
  42. }
  43. else
  44. {
  45.         ShowMessage("La clé n'existe pas!" );
  46. }
  47. //----------------------------------------------------------------------------


Je peux créer des clés comme sur l'exemple suivant, mais je ne peux pas ouvrir de clé... est ce que qlq'1 aurait une idée?

Code :
  1. if(registre->CreateKey("\\Software\\Essai" ))
  2. {
  3.         ShowMessage("créé" );
  4. }
  5. else
  6. {
  7.       ShowMessage("pas créé" );
  8. }


Pq que je fasse un OpenKeyReadOnly ou un OpenKey; les deux ne fonctionnent pas...
Et où est-il possible de trouver une doc correcte sur TRegistry?
Merci d'avance.


Message édité par stage le 24-04-2007 à 14:06:30
zeb
Profil : Modérateur libre
Plus d'informations

Va lire les règles :fou: :jap:


Message édité par zeb le 25-04-2007 à 12:05:40

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

désolé, j'étais entrain de le réédité quand t'as posté... :$ je les ai lu, mais c'est un oubli...


Message édité par stage le 24-04-2007 à 14:21:48
Profil : Pointeur
Plus d'informations

petit conseil : utilise std::auto_ptr au lieu de ces imondes try / finally pas standards ... (bon, tu vas me dire que les objects borland ne sont pas non plus standard mais c'est pas une raison :o)


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Profil : Pointeur
Plus d'informations

et puis supprimer l'objet juste avant de l'utiliser c'est pas vraiment une bonne idée :o


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Plus d'informations

a écrit :

et puis supprimer l'objet juste avant de l'utiliser c'est pas vraiment une bonne idée :o


Ouais, c'est sur que c'est pas terrible... grosse erreur de ma part, par manque d'attention je dirais.

Sinon, je suppose qu'il faut utiliser la "class std::auto_ptr< _Tp >" mais je connais pas, qlq'1 aurait de quoi me guider?

pq en plus, moi et les templates... on est pas super pôte...

Et après avoir "réglé" le problème de la suppression, j'ai testé ça:

Code :
  1. chemin="SOFTWARE\\Funk\ Software,\ Inc.\\Odyssey\\client\\profiles";
  2. ajout="\\authentification";
  3. if(registre->OpenKeyReadOnly(chemin))
  4.         {
  5.                 ShowMessage("test2" );
  6.                 registre->GetKeyNames(Liste);
  7.                 taille = Liste->Count;
  8.                 for(int i=0; i<taille;i++)
  9.                 {
  10.                         ShowMessage("test"+i);
  11.                         // On recupère la 1er valeur de la liste.
  12.                         Chaine = Liste->Strings[i];
  13.                         //on concatène tout pour aller jusqu'au chemin voulu!
  14.                         tmp=chemin+"\\"+Chaine;    //+ajout;
  15.                         registre->CloseKey();
  16.                         //Est-ce qu'il faut fermer la clé avant de lui
  17.                         //affecter une nouvelle valeur? [#ff0e00]La réponse est "oui"[/#ff0e00]
  18.                         if(registre->OpenKeyReadOnly(tmp))
  19.                         {
  20.                                 //Voir quelle clé il faut ouvrir
  21.                                 //s'il faut ouvrir authentification et                                           //ouvrir "primary EAP" ou s'il faut ouvrir                                        //seulement "primary EAP"
  22.                                 ShowMessage("test3" );
  23.                       registre->OpenKey("authentification",false);
  24.                       registre->WriteString("primary EAP", "PEAP" );
  25.                         }
  26.                 }
  27.              //Ferme et supprime la clé 'registre'
  28.              delete registre;
  29.               delete Liste;
  30.         }
  31.         else
  32.         {
  33.             ShowMessage("La clé n'existe pas!" );
  34.         }



Et forcement, il me dit que la clé n'existe pas... si non, ça aurait été trop beau... :(

donc, ça veut dire que le "if(registre->OpenKeyReadOnly(chemin))" ne fonctionne pas... donc je réfléchis, mais si encore une fois quelqu'un peut m'aider, ça serait fort aimable ^^
Merci.


edit: pour le chemin, faut l'écrire comme ça:

Code :
  1. chemin="SOFTWARE\\Funk\ Software,\ Inc.\\Odyssey\\client\\profiles";
  2. ajout="\\authentification";


Ce qui règle une partie de mes pbl... mais pas tous, pq mtn, il m'affiche "test2", et "test" mais pas la valeur du i... et il m'affiche aussi "test3" et plus de "La clé n'existe pas" :d


Message édité par stage le 25-04-2007 à 10:07:44
zeb
Profil : Modérateur libre
Plus d'informations

Code :
  1. ShowMessage("test"+i);


Ah non, là il ne peut pas t'afficher la valeur de i, c'est sûr. Le caractère de la valeur de i, oui. Or, c'est zéro [:spamafote]

Utilise IntToStr (ou équivalent).


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

ah ok, je pensais que ça allait marcher comme en java... que ça allait concaténer tout le truc et tout caster.
enfin là, j'ai bien avancé, il me manque plus qu'a modifier la valeur de la clé, mais là ça merdouille pas mal...a cause d'une exception...
Comment ça marche pour la modif'?

Code :
  1. tmp=chemin+"\\"+Chaine+ajout; // je suis donc dans le dossier authentification
  2. if(registre->OpenKeyReadOnly(tmp))
  3. {
  4.         registre->CloseKey();
  5.         //if(registre->OpenKey("authentification",false))
  6.         if (registre->OpenKey("primary\ EAP", false))
  7.         {
  8.             ShowMessage("ouvert" );
  9.                 registre->WriteString("primary\ EAP", "PEAP" );
  10.     }
  11.         else
  12.         {
  13.             ShowMessage("pas ouvert" );
  14.         }
  15.         /*if (registre->KeyExists("primary\ EAP" ))
  16.         {
  17.             ShowMessage("clé primary EAP existe" );
  18.         }
  19.         else
  20.         {
  21.             ShowMessage("clé primary EAP n'existe pas" );
  22.         } */
  23.         registre->CloseKey();
  24. }



Pq là, il me dit bien que la clé existe et qu'elle est ouverte, mais problème avec le "registre->WriteString("primary\ EAP", "PEAP" );"
est-ce que la méthode que j'utilise est bonne ou alors c'est pas ça?

PS: Le "test"+i est pas important,c 'était juste pour mes testes de boucles etc...
en tout cas, merci pour les infos ;)

zeb
Profil : Modérateur libre
Plus d'informations

Ligne 2 : OpenKeyReadOnly

:lol: Ne me dis pas que tu mauvais à ce point en anglais !!


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
zeb
Profil : Modérateur libre
Plus d'informations

Je suis vraiment ravi d'aider quelqu'un qui semble chercher de son côté. Tes messages, tes tests et ton code en commentaire prouevnt que tu te donnes la peine de chercher par toi-même.


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

a écrit :

Ligne 2 : OpenKeyReadOnly

:lol: Ne me dis pas que tu mauvais à ce point en anglais !!


Code :
  1. if(registre->OpenKeyReadOn