IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

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

SommaireSystèmeBase de Registre (12)
précédent sommaire suivant
 

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.

Mis à jour le 31 janvier 2005 Laurent Dardenne

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>
L'accès à la base de registre se fait en plusieurs étapes.

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();
Il est possible de passer au constructeur un long pour initialiser la propriété Access (niveau d'accès à utiliser).

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;
Si par la suite on souhaite accéder à une autre clé racine on doit fermer la clé racine courante puis ouvrir avec la nouvelle clé racine.

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();
Le comportement de cette méthode dépend de la propriété LazyWrite. Il est recommandé de ne pas maintenir les clés ouvertes plus longtemps que nécessaire.

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;
Le destructeur appelle la méthode CloseKey avant de détruire l'objet. La suite d'instructions qui suit est donc redondante :

Code c++ : Sélectionner tout
1
2
registre->CloseKey(); 
delete regisre;
Note : Il est recommandé d'utiliser la gestion d'exception de type try...catch et/ou try...__finally afin de gérer tous les cas d'erreurs et ainsi libérer la mémoire allouée.

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; 
}

Mis à jour le 31 janvier 2005 Laurent Dardenne Ricky81

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é") 
{ 
  // ...

Mis à jour le 31 janvier 2005 Laurent Dardenne

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") 
{ 
  // ...

Mis à jour le 31 janvier 2005 Laurent Dardenne

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() 
{ 
  // ...
Cette méthode est généralement couplée avec la méthode GetKeyNames.

Mis à jour le 31 janvier 2005 Laurent Dardenne

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 
{ 
  ...
Une clé en absolu l'est par rapport à la clé racine, la chaîne passée commence nécessairement par \ (doublé ici car \ est le caractère d'échappement). Ici nous créons la clé HKEY_CURRENT_USER\Software\Essai.

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 
   { 
    ...
Une clé en relatif l'est par rapport à la clé courante. Ici nous nous sommes placés sur la clé HKEY_CURRENT_USER\Software et créons donc la clé HKEY_CURRENT_USER\Software\Test.

Mis à jour le 31 janvier 2005 Ricky81

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);
Exemple :

Code c++ : Sélectionner tout
registre->OpenKey("nom_de_la_clé", true);
Notez ici que le paramètre CanCreate a pour valeur true. Cela permet au cas où la clé n'existerait pas, de forcer sa création puis son ouverture. Il s'agit en quelque sorte d'une combinaison d'appel de CreateKey puis d'OpenKey.

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");
Pour l'écriture :

Code c++ : Sélectionner tout
registre->WriteString("nom_de_la_valeur", "valeur");
On utilisera cette méthode pour modifier une clé existante.

Pour la suppression :

Code c++ : Sélectionner tout
1
2
3
if(registre->DeleteValue("nom_de_la_valeur"); 
{ 
  ...
Note : Ici nous avons traité les exemples de la lecture, de l'écriture et de la suppression d'une valeur d'une clé de type chaîne de caractères. Il existe des méthodes spécifiques pour manipuler les autres types de données. Pour les connaître reportez-vous à l'aide.

Mis à jour le 31 janvier 2005 Laurent Dardenne

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;

Mis à jour le 31 janvier 2005 Ricky81

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;

Mis à jour le 31 janvier 2005 Ricky81

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 
}
Note : Après l'avoir supprimée, il n'est pas nécessaire de fermer cette clé.
Le comportement de cette méthode diffère selon l'OS. Consultez l'aide.

Mis à jour le 31 janvier 2005 Laurent Dardenne

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);
Le paramètre "UNCName" contient un nom de machine au format UNC. Le format UNC étant égal à \\<serveur>\<nom_partage> (ne pas oublier de doubler le caractère \ pour une chaîne de caractères).

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; 
    } 
}

Mis à jour le 31 janvier 2005 Laurent Dardenne

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.

Mis à jour le 31 janvier 2005 Laurent Dardenne

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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.