FAQ C++ BuilderConsultez toutes les FAQ
Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010 Ajouter une question
Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez
Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.
L'équipe C++ Builder de Developpez.
Commentez cette FAQ : Commentez
- Comment est structurée la base de registre ?
- Comment accéder à la base de registre de Windows ?
- Comment tester l'existence d'une clé ?
- Comment tester l'existence d'une valeur d'une clé ?
- Comment tester l'existence d'une sous-clé ?
- Comment créer une clé ?
- Comment ouvrir une clé et lire/modifier/supprimer une valeur ?
- Comment lire les noms de toutes les sous-clés de la clé en cours ?
- Comment lire toutes les valeurs de la clé en cours ?
- Comment supprimer une clé ?
- Comment opérer sur une base de registre d'une machine distante ?
- Comment modifier les droits d'accès d'un objet de type TRegistry ?
La base de registre stocke ses données dans un arbre hiérarchiquement structuré. La partie du registre qui apparaît en tant que fichier sur votre disque dur s'appelle une ruche. Le sous-arbre du registre est divisé en ruches (en raison de leur ressemblance avec la structure cellulaire d'une ruche d'abeilles). Une ruche correspond à un ensemble discret de clés, de sous-clés et de valeurs, qui figure en haut de la hiérarchie du Registre.
Chaque noeud dans l'arbre s'appelle une clé.
Chaque clé peut contenir des sous-clés et des rubriques valuées appelées valeurs. Une clé peut avoir n'importe quel nombre de valeurs, et les valeurs peuvent être de n'importe quel type prédéfini.
Chaque clé possède un nom se composant d'un ou plusieurs caractères imprimables c'est-à-dire, s'étendant des valeurs ASCII 32 à 127.
Les noms principaux ne peuvent pas inclure d'espace, d'antislash (\), ou de caractère de remplacement (* ou ?).
Les noms principaux commençant par un point (.) sont réservés.
Le nom de chaque sous-clé est unique dans le contexte de sa clé parente.
Les noms de clé n'utilisent pas d'autres langues que l'US ; les valeurs peuvent par contre utiliser d'autres langues.
Notes:
- Une clé absolue commence par une barre oblique inverse (\) et est sous-clé de la clé racine.
- Une clé relative est sous-clé de la clé en cours.
- Une clé non-volatile est stockée dans un fichier et est préservée lorsque le système redémarre ( NT ).
- Une clé volatile est stockée en mémoire et n'est pas préservée lorsque le système redémarre ( NT ).
Clés racines prédéfinies :
HKEY_CURRENT_USER
Correspond à la racine contenant les informations de configuration de l'utilisateur connecté. Les paramètres utilisateur des dossiers, des couleurs d'écran et du Panneau de configuration sont stockés ici. Ces informations constituent un profil utilisateur.
HKEY_USERS
Correspond à la racine de tous les profils d'utilisateurs de l'ordinateur. HKEY_CURRENT_USER est une sous-clé de HKEY_USERS.
HKEY_LOCAL_MACHINE
Contient les informations de configuration spécifiques à l'ordinateur (pour tous les utilisateurs).
HKEY_CLASSES_ROOT
Sous-clé de HKEY_LOCAL_MACHINE\Software. Les informations stockées ici garantissent l'ouverture du programme voulu lorsque vous ouvrez un fichier depuis l'Explorateur Windows.
HKEY_CURRENT_CONFIG
Contient des informations sur le profil matériel utilisé par l'ordinateur local au démarrage.
Types de données prédéfinis :
REG_BINARY
Données binaires brutes. La plupart des informations concernant les composants matériels est stockée sous forme de données binaires.
REG_DWORD
Données représentées par un nombre de 4 octets. Beaucoup de paramètres concernant les pilotes de périphériques et les services sont de ce type.
REG_EXPAND_SZ
Chaîne de longueur variable. Ce type de données comprend les variables qui sont résolues lorsqu'un programme ou un service les utilise.
REG_MULTI_SZ
Chaîne multiple. Les valeurs qui contiennent des listes ou plusieurs valeurs sous une forme lisible par l'homme sont généralement de ce type. Les différentes valeurs sont séparées par un espace, une virgule ou un autre signe.
REG_SZ
Chaîne de texte de longueur fixe.
REG_FULL_RESOURCE_DESCRIPTOR
Série de tableaux imbriqués destinés à stocker une liste de ressources pour un composant matériel ou un pilote.
A noter que les noms de clés et de type prédéfinis dépendent de la version de l'OS. Certaines versions de C++ Builder ne gèrent nativement qu'un sous ensemble de type prédéfini. Reportez-vous à l'aide en ligne du programme Regedit ou au SDK Windows.
Tous les accès à la base de registre sont encapsulés dans une classe : TRegistry. Cette classe est définie dans l'unité Registry, c'est pourquoi il est indispensable d'inclure registry.hpp avant toute manipulation du registre.
Code c++ : | Sélectionner tout |
#include <registry.hpp>
1. Création d'un objet Registry :
Il faut commencer par initialiser un objet pour manipuler la base de registre :
Code c++ : | Sélectionner tout |
TRegistry *registre = new TRegistry();
2. Sélection de la clé racine :
Avant d'accéder à la clé, il faut en spécifier la clé racine dans le registre. Cela se fait en affectant le nom de la clé racine à la propriété RootKey de l'objet registre précédemment crée. Ce nom de clé est un nom prédéfini, par exemple HKEY_CURRENT_USER (voyez dans Winreg.h pour les constantes disponibles).
Code c++ : | Sélectionner tout |
registre->RootKey = HKEY_CLASSES_ROOT;
3. Fermeture de la clé racine :
Avant de terminer les opérations sur la base de registre ou de modifier la propriété RootKey, il est important de valider les modifications apportées par la fermeture la clé en cours. Le type TRegistry possède une méthode qui permet de le faire : CloseKey.
Code c++ : | Sélectionner tout |
registre->CloseKey();
4. Destruction de l'objet Registre et libération des ressources :
Afin de libérer la mémoire, il est nécessaire de détruire l'objet créé au début du traitement.
Code c++ : | Sélectionner tout |
delete registre;
Code c++ : | Sélectionner tout |
1 2 | registre->CloseKey(); delete regisre; |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | TRegistry *registre = new TRegistry(); try { registre->RootKey = HKEY_CLASSES_ROOT; // Traitement... } __finally { delete registre; } |
Quelques méthodes de TRegistry n'opèrent que sur des clés existantes, dans ces cas-là on testera préalablement l'existence de la clé en utilisant la méthode KeyExists.
Code c++ : | Sélectionner tout |
1 2 3 | if registre->KeyExists("nom_de_la_clé") { // ... |
Quelques méthodes de TRegistry n'opèrent que sur des valeurs de clé existante, dans ces cas-là on testera préalablement leur existence en utilisant la méthode ValueExists.
Code c++ : | Sélectionner tout |
1 2 3 | if registre->ValueExists("nom_de_la_valeur") { // ... |
Lorsqu'on exécute un traitement itératif sur un sous-ensemble de clés il est parfois nécessaire de savoir si la clé en cours possède des sous-clés. Dans ces cas-là on utilisera la méthode HasSubKeys.
Code c++ : | Sélectionner tout |
1 2 3 | if registre->HasSubKeys() { // ... |
Pour créer une nouvelle clé on utilise la méthode CreateKey. Le nom de la clé à créer peut être absolu ou relatif.
Code c++ : | Sélectionner tout |
1 2 3 4 5 | TRegistry *registre = new TRegistry(); registre->RootKey = HKEY_CURRENT_USER; if(registre->CreateKey("\\Software\\Essai")) // Nom absolu { ... |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 | TRegistry *registre = new TRegistry(); registre->RootKey = HKEY_CURRENT_USER; if(registre->OpenKeyReadOnly("Software")) { if(registre->CreateKey("Test")) // Nom relatif { ... |
Pour accéder à la valeur d'un nom de clé, il faut ouvrir la clé qui la contient. On utilise pour cela la méthode OpenKey de TRegistry :
Code c++ : | Sélectionner tout |
bool __fastcall OpenKey(const AnsiString Key, bool CanCreate);
Code c++ : | Sélectionner tout |
registre->OpenKey("nom_de_la_clé", true);
Il est à présent possible de lire, écrire ou supprimer une valeur d'une clé.
Pour lire, écrire ou supprimer une valeur chaîne dans la clé, on utilisera les méthodes ReadString, WriteString ou DeleteString de TRegistry.
Pour la lecture :
Code c++ : | Sélectionner tout |
maChaine = registre->ReadString("nom_de_la_valeur");
Code c++ : | Sélectionner tout |
registre->WriteString("nom_de_la_valeur", "valeur");
Pour la suppression :
Code c++ : | Sélectionner tout |
1 2 3 | if(registre->DeleteValue("nom_de_la_valeur"); { ... |
Lorsqu'on envisage d'effectuer un traitement itératif sur un ensemble de clés, on utilise la méthode GetKeyNames. Elle permet de récupérer une liste de l'ensemble des noms des sous-clés de la clé en cours en initialisant un objet d'un type descendant de TStrings.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | TRegistry *registre = new TRegistry(); TStringList *mesCles = new TStringList(); // la clé racine par défaut est HKEY_CURRENT_USER registre->OpenKeyReadOnly("Software"); // clé courante registre->GetKeyNames(mesCles); ShowMessage(mesCles->Count); // affiche le nombre de sous-clés delete registre; delete mesCles; |
Lorsqu'on envisage d'effectuer un traitement itératif sur l'ensemble des valeurs d'une clé, on utilise la méthode GetValueNames. Elle permet de récupérer une liste de l'ensemble des valeurs de la clé en cours en initialisant un objet d'un type descendant de TStrings.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | TRegistry *registre = new TRegistry(); TStringList *mesCles = new TStringList(); registre->OpenKeyReadOnly("Software\\Borland\\C++Builder\\6.0"); // clé courante registre->GetValueNames(mesCles); // lecture des noms // affichage d'une des valeurs AnsiString val, res; val = mesCles->Strings[6]; res = val + "=" + registre->ReadString(val); ShowMessage(res); // affiche "Version=PRO" delete registre; delete mesCles; |
On peut supprimer une clé devenue inutile : cette opération supprimera également toutes les valeurs qu'elle contient.
Ceci est le rôle de la méthode DeleteKey de TRegistry.
Code c++ : | Sélectionner tout |
1 2 3 4 | if(registre->DeleteKey("nom_de_la_clé")) { // la clé a bien été supprimée } |
Le comportement de cette méthode diffère selon l'OS. Consultez l'aide.
Il est parfois nécessaire de modifier des clés de registre d'une machine distante. Dans ce cas on utilise la méthode RegistryConnect.
Code c++ : | Sélectionner tout |
bool __fastcall RegistryConnect(const AnsiString UNCName);
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | void __fastcall LitClesDistantes(AnsiString serverName, TStringList* listeSousCles) { AnsiString CleMachineDistante = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion"; AnsiString CleRecherchee = "App Paths"; TRegistry *registreMachineDistante = new TRegistry(); listeSousCles->Clear(); try { /* pour les accès distant la propriété RootKey est égale soit à HKEY_USERS soit à HKEY_LOCAL_MACHINE */ registreMachineDistante->RootKey = HKEY_LOCAL_MACHINE; if(!registreMachineDistante->RegistryConnect("\\\\"+serverName)) { // vérifier la configuration réseau ou les permissions d'accès ShowMessage("Impossible de se connecter."); return; } if(registreMachineDistante->OpenKeyReadOnly("\\"+CleMachineDistante+"\\"+CleRecherchee)) { registreMachineDistante->GetKeyNames(listeSousCles); // liste des sous-clés } else { ShowMessage("Erreur, clé absente."); } } __finally { delete registreMachineDistante; } } |
La propriété ACCESS spécifie le niveau d'accès à utiliser lors de l'ouverture d'une clé. Le niveau d'accès autorisé dépend des permissions associées à votre compte NT.
L'accès à la base de registre d'une machine peut être limité par l'administrateur. Si vous définissez la propriété Access=KEY_ALL_ACCESS vous devez avoir le droit d'accès NT 'contrôle total' sur la clé que vous souhaitez modifier.
Sous NT/W2K et XP, vous pouvez visualiser les droits en utilisant l'outil RegEdt32.
Voir l'aide en ligne pour plus de détails.
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.