Base de registre windows: lecture et écriture

Décembre 2017


= =1) Qu'est-ce que la base de registre?==


On peut comparer la base de registre à un énorme fichier *.ini. Windows y répertorie toutes les informations qui lui sont nécessaires à la gestion et l'utilisation du matériel, comme du logiciel (hardware et software). La connaissance de la base permettra à ceux qui en ont l'ambition de pouvoir accéder à des paramètres cachés, ou tout simplement à réparer quelques lacunes de windows. Mais ce tutorial n'est pas fait pour apprendre les possibilités de la base de registre (manipulation avec des fichiers reg, définitions des clées => voir sur le net), mais pour découvrir les moyens que Delphi mais à notre disposition pour l'exploiter.

2) Organisation de la base de registre.


La base de registre s'organise un peu comme un répertoire. Nous avons 5 répertoires principaux (ou ruches), de type HKEY . Viennent ensuite les sous-répertoires (ou clés et sous-clés). Ces derniers comportent ce que l'on appelle des valeurs, qui peuvent, elles, être de 5 types différents:
- REG_BINARY : valeur binaire
- REG_DWORD : valeur décimale ou hexadécimale
- REG_EXPAND_SZ : valeur chaine (ou string)
- REG_MULTI_SZ : valeur chaine (ou string)
- REG_SZ : valeur chaine (ou string)

Vous avez sans doute remarqué qu'il existe 3 sortes de valeurs qui ont le même format d'écriture. La subtilité de la chose et en fait beaucoup plus complexe qu'une ça, il est inutile de s'y attarder, ce serait un hors sujet!.


Voici concrétement un exemple de hiérarchie:

[Image:http://static.commentcamarche.net/codes-sources.commentcamarche.net/pictures/faq-c495d165b96f9b9f647231fbdb7e184f.png|500px||center]


3) Les outils mis à disposition pas Delphi.


Nous allons à présent découvrir l'utilisation de base avec Delphi. Pour commencer, il faut inclure l'unité Registry dans uses, sinon les fonctions utilisées ne seront pas trouvées lors de la compilation et donc, des erreurs seront générées.

Nous utiliserons des fonctions de base suivantes:

Create : pour créer un objet TRegistry


RootKey : pour définir la ruche (HKEY)
OpenKey('SousCle',Flag) : pour ouvrir la clé (ou sous-clé) et la créer ou non selon le Flag (voir plus bas)
WriteString('Valeur','Variable') : pour écrire le contenu d'une valeur de type SZ, EXPAND_SZ ou MULTI_SZ
WriteInteger('Valeur',Variable) : pour écrire le contenu d'une valeur de type DWORD
WriteBinaryData('Valeur',Variable,taille de la variable) : pour écrire le contenu d'une valeur de type BINARY
ReadString('Valeur') : pour lire le contenu d'une valeur de type SZ, EXPAND_SZ ou MULTI_SZ
CloseKey : pour fermer la clé et/ou sous-clé
Free : pour libérer l'objet TRegistry créé


La méthode à suivre pour l'écriture est la suivant:

- déclare Registry dans uses
dans la procédure utilisée:
- déclarer un objet TRegistry
- créer un objet TRegistry
- définir la ruche (HKEY) avec RootKey - ouvrir la clé ou sous-clé avec OpenKey('SousCle',Flag). si Flag True, la clé est créée si elle n'existe pas. Si Flag False, la clé n'est pas créé si elle n'existe pas. Dans ce cas, prévoir la gestion des exceptions.
- écrire dans la clé ouverte le contenu d'une valeur avec Write[type adéquat * . si la valeur existe déjà, elle sera réécrite. Si elle n'existe pas elle sera créée.
- fermer la clé ouverte avec CloseKey
- libérer l'objet TRegistry créé.

La façon la plus simple pour bien comprendre est l'exemple (ici écrire une valeur de type SZ, soit string):

procedure Button1Click(Sender: TObject);
var Registre : TRegistry; //déclaration de l'objet TRegistry
begin
Registre: =TRegistry.Create; //création de l'objet TRegistry, ici il s'appelle Registre
Registre.RootKey:= HKEY_CURRENT_USER; //définition de la ruche, ici HKEY_CURRENT_USER
Registre.OpenKey('\ceci est une clé\ceci est une sous clé',True); //ouverture de la clé puis sous clé \ceci est une clé\ceci est une sous clé.
Registre.WriteString('ceci est une valeur','coucou'); //écriture de dans la valeur nommée ceci est une valeur
Registre.CloseKey; //fermeture de la clé et sous clé

Free; //libération de Registre


end;

Pour l'écriture, c'est le même principe, sauf qu'à la place d'utiliser Registre.WriteString, on prendra Registre.ReadString('ceci est une valeur') qui renverra un string.

Voilà, c'est fini pour les manipulations de base de la base de registre windows avec Delphi! Bien sûr, à vous d'adapter ensuite le type des valeurs (BINARY, DWORD...), le principe est le même.

Astuces:

- pour les DWORD, utilisez des integer, windows converti lui-même en hexa par la suite.
- pour les SZ, EXPAND_SZ et MULTI_SZ, un seul et même type: string. c'est l'interprétation de windows derrière qui les différencie (non expliqué dans ce tutorial).
- pour les BINARY, utilisez les array [0..... * of byte.

J'espère que tout ceci vous sera bien utile pour débuter avec la base de registre Windows!
A bientôt!

Adresse d'origine
Publié par freetai.
Ce document intitulé «  Base de registre windows: lecture et écriture  » issu de CodeS-SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Ajouter un commentaire

Commentaires

Commenter la réponse de cs_grandvizir
[delphi] optimiser le contenu de vos zips
[delphi] déclarer et utiliser les types