Modification de la base de registre

stage

Nouveau membre
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.

 

stage

Nouveau membre
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.)
 

boub popsyteam

Grand Maître
Fait ça propre, donc ne supputes rien et verifie tout :)
 

zeb

Modérateur
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.
 

stage

Nouveau membre
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

Modérateur
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".
 

stage

Nouveau membre
Voici mon code:

[cpp]
TRegistry *registre = new TRegistry();
TStringList *Liste = new TStringList();
int taille;
AnsiString Chaine, tmp, chemin,ajout;

try
{
//on se place dans la racine 'HKEY_CURRENT_USER'
registre->RootKey = HKEY_CURRENT_USER;
}
__finally
{
delete registre;
}
chemin="SOFTWARE/Funk Software, Inc./Odyssey/client/profiles";
ajout="/authentification";

//on regarde si la clé jusqu'au profiles existe
if(registre->OpenKeyReadOnly(chemin))
{
registre->GetKeyNames(Liste);
taille = Liste->Count;

for(int i=0; i<taille;i++)
{
// On recupère la 1er valeur de la liste.
Chaine = Liste->Strings;
//on concatène tout pour aller jusqu'au chemin voulu!
tmp=chemin+"/"+Chaine; //+ajout;
//Est-ce qu'il faut fermer la clé avant de lui
//affecter une nouvelle valeur?
if(registre->OpenKeyReadOnly(tmp))
{
//Voir quelle clé il faut ouvrir
//s'il faut ouvrir authentification et
//ouvrir "primary EAP" ou s'il faut ouvrir
//seulement "primary EAP"

registre->OpenKey("authentification",false);
registre->WriteString("primary EAP", "PEAP");
}
}
//Ferme et supprime la clé 'registre'
delete registre;
delete Liste;
}
else
{
ShowMessage("La clé n'existe pas!");
}


//----------------------------------------------------------------------------

[/cpp]
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?
[cpp]
if(registre->CreateKey("\\Software\\Essai"))
{
ShowMessage("créé");
}
else
{
ShowMessage("pas créé");
}

[/cpp]
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.
 

stage

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

KangOl

Grand Maître
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)
 

KangOl

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

stage

Nouveau membre
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:
[cpp]
chemin="SOFTWARE\\Funk\ Software,\ Inc.\\Odyssey\\client\\profiles";
ajout="\\authentification";


if(registre->OpenKeyReadOnly(chemin))
{
ShowMessage("test2");
registre->GetKeyNames(Liste);
taille = Liste->Count;

for(int i=0; i<taille;i++)
{
ShowMessage("test"+i);
// On recupère la 1er valeur de la liste.
Chaine = Liste->Strings;
//on concatène tout pour aller jusqu'au chemin voulu!
tmp=chemin+"\\"+Chaine; //+ajout;

registre->CloseKey();

//Est-ce qu'il faut fermer la clé avant de lui
//affecter une nouvelle valeur? La réponse est "oui"
if(registre->OpenKeyReadOnly(tmp))
{
//Voir quelle clé il faut ouvrir
//s'il faut ouvrir authentification et //ouvrir "primary EAP" ou s'il faut ouvrir //seulement "primary EAP"

ShowMessage("test3");
registre->OpenKey("authentification",false);
registre->WriteString("primary EAP", "PEAP");
}
}
//Ferme et supprime la clé 'registre'
delete registre;
delete Liste;
}
else
{
ShowMessage("La clé n'existe pas!");
}
[/cpp]

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:
[cpp]
chemin="SOFTWARE\\Funk\ Software,\ Inc.\\Odyssey\\client\\profiles";
ajout="\\authentification";
[/cpp]
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
 

zeb

Modérateur
Code:
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).
 

stage

Nouveau membre
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'?
[cpp]
tmp=chemin+"\\"+Chaine+ajout; // je suis donc dans le dossier authentification
if(registre->OpenKeyReadOnly(tmp))
{
registre->CloseKey();
//if(registre->OpenKey("authentification",false))
if (registre->OpenKey("primary\ EAP", false))
{
ShowMessage("ouvert");
registre->WriteString("primary\ EAP", "PEAP");
}
else
{
ShowMessage("pas ouvert");
}
/*if (registre->KeyExists("primary\ EAP"))
{
ShowMessage("clé primary EAP existe");
}
else
{
ShowMessage("clé primary EAP n'existe pas");
} */
registre->CloseKey();
}
[/cpp]

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

Modérateur
Ligne 2 : OpenKeyReadOnly

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

zeb

Modérateur
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.
 

stage

Nouveau membre
Ligne 2 : OpenKeyReadOnly

:lol: Ne me dis pas que tu mauvais à ce point en anglais !!
[cpp]
if(registre->OpenKeyReadOnly(tmp))
/* Ne t'en fais pas pour mon niveau d'anglais, je suis pas si mauvais que ça, mais sachant
que je ferme la clé juste après et que j'en ouvre une nouvelle qui n'est pas en ReadOnly
je pensais que ça passait vu que la clé ouverte en ReadOnly ne me servait plus par la suite */

{
registre->CloseKey();
[...]
if (registre->OpenKey("primary\ EAP", false))
[...]
[/cpp]
 

zeb

Modérateur
Ok pour l'anglais ;)
Alors ça marche si le premier OpenKey n'est pas ReadOnly ?
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 080
Membres
1 586 395
Dernier membre
franckorus
Partager cette page
Haut