Home » Tipps & Tricks » System » Registry » Mit der Windows-Registrierung arbeiten

Mit der Windows-Registrierung arbeiten

Was ist die Registry?

Die Registry ist die zentrale Datenbank eines Windows-Betriebssystems.
In der Registry werden die meisten Einstellungen und Informationen des Betriebssystems gespeichert. Dazu gehören zum Beispiel der Dateiname des Hintergrundbildes, Informationen über installierte Software und vieles mehr. Diese Werte/Informationen lassen sich ohne große Umstände aus der Datenbank auslesen und abändern.
ACHTUNG! Beachten Sie, dass durch die Manipulation der Registry ins System eingegriffen wird. Legen Sie zuvor ein Backup Ihrer persönlichen Dateien an, um Datenverlust vorzubeugen.
Trotz dieses relativ einfachen Zugriffs und der hirarchisch aufgebauten Struktur sollte man darauf verzichten, zu viele Werte in der Registry zu speichern, da dadurch das System ausgebremst wird. Die Registry dient hauptsächlich zum Speichern von Daten, die von mehreren Programmen verwendet werden.

Eine Instanz erstellen

Delphi kapselt den Registryzugriff in einem Objekt namens TRegistry. Es befindet sich in der Unit Registry, welche der uses-Klausel hinzugefügt werden musst. Bevor Sie mit diesem Objekt arbeiten können, muss es deklariert und eine Instanz davon erstellt werden:

uses
 Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
 Registry: TRegistry;
begin
 Registry := TRegistry.Create;

Die Registrierungsdatenbank hat einen hierarchischen Aufbau. Am Anfang dieser Hierarchie stehen mehrere Hauptschlüssel, die wiederum weitere Unterschlüssel enthalten. Alle Schlüssel die Ihre Anwendung erzeugt, öffnet oder liest sind Unterschlüssel von diesen vordefinierten Hauptschlüsseln. Die Eigenschaft Rootkey definiert diesen Hauptschlüssel für das TRegistry-Objekt. Standardgemäß wird die Eigenschaft Rootkey bei der Erzeugung des Objekts auf den Wert HKEY_CURRENT_USER gesetzt.
Mögliche Werte von Rootkey:

  • HKEY_CLASSES_ROOT
  • HKEY_CURRENT_USER
  • HKEY_LOCAL_MACHINE
  • HKEY_USERS
  • HKEY_PERFORMANCE_DATA
  • HKEY_CURRENT_CONFIG
  • HKEY_DYN_DATA

Ein Schlüssel muss zuvor geöffnet werden, damit mit ihm gearbeitet werden kann. Dies geschieht mit dem Aufruf von Openkey:

function OpenKey(const Key: string; CanCreate: Boolean): Boolean;

Die Funktion erwartet zwei Parameter: Erstens den Schlüssel, welcher geöffnet werden soll (immer relativ von bisher geöffneten Schlüsseln) und zweitens einen booleschen Parameter, welcher steuert, ob ein Schlüssel, wenn er noch nicht existiert erstellt werden soll (True) oder nicht (False). Die Funktion gibt True zurück, falls der Schlüssel erfolgreich geöffnet werden konnte. Jeder weitere Aufruf von Openkey öffnet den Schlüssel relativ vom bisher geöffnetem Schlüssel. Bevor man also einen anderen Schlüssel öffnen möchte ist der Aufruf CloseKey; notwendig.

Lesen/Schreiben von Werten

Das Objekt ist jetzt bereit in die Registry Werte zu schreiben und auch aus dieser zu lesen. Dies geschieht mit der Methode WriteString bzw. mit ReadString. Die beiden Parameter, die WriteString erwartet, müssen Sie mit Angaben zum Namen (Typ String) und zum Wert (auch vom Typ String), welcher gespeichert werden soll, füllen. Ist der Name bereits vorhanden, wird dieser überschrieben.

ReadString erwartet nur einen Parameter, nämlich den Namen des zu lesenden Werts. Als Result wird der Wert mit diesem Namen zurückgegeben. Man hat auch die Möglichkeit direkt einen Integer-Wert, einen booleschen Wert oder eine Gleitkommazahl in die Registry zu schreiben/lesen. Für diese Aufgabe gibt es die Methoden WriteInteger, WriteBool und WriteFloat, bzw. ReadInteger, ReadBool und ReadFloat. Die Parameter sind bei diesen Methoden identisch mit Ihren Verwandten WriteString und ReadString. Natürlich muss der übergebene Wert bzw. der Rückgabewert vom entsprechenden Typ sein.

Da für das Objekt Speicher reserviert wurde, muss dieser mit Free wieder freigegeben werden.

Beispiel

Es folgt jetzt ein Beispiel, welches einen String (Edit1.Text) und einen Integer (SpinEdit1.Value) in den Schlüssel „HKEY_CURRENT_USER\Software\Test\Firma\TestProdukt“ schreibt. Zur Sicherheit kommt das ganze in einen try-finally-Block.

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TRegistry.Create do
  begin
    try
      Rootkey:=HKEY_CURRENT_USER; //Hauptschlüssel
      if OpenKey('Software\Test\Firma\TestProdukt',True) then //Unterschlüssel öffnen
      begin
        WriteString('TestString',Edit1.Text);
        WriteInteger('TestInteger',SpinEdit1.Value);
      end;
    finally
      Free;
    end;
  end;
end;

Tipp: Sollte der Eintrag nicht sofort in RegEdit erscheinen, einfach mal F5 drücken.

Das Lesen der Werte aus der Registry ist nicht viel schwieriger. Der Wert „TestString“ wird in das Edit-Feld eingelesen und die Integer-Zahl „TestInteger“ wird SpinEdit1 übergeben. Zur Speichersicherheit wird das ganze in einem try-finally-Block gekapselt.

procedure TForm1.Button2Click(Sender: TObject);
begin
  with TRegistry.Create do
  begin
    try
      Rootkey:=HKEY_CURRENT_USER;
      if OpenKey('Software\Test\Firma\TestProdukt',True) then
      begin
        Edit1.Text:=ReadString('TestString');
        SpinEdit1.Value:=ReadInteger('TestInteger');
      end;
    finally
      Free;
    end;
  end;
end;

Falls man unter Windows NT/2000/XP usw. nicht als Administrator eingeloggt ist, kann es sein, dass man keine Schreibrechte und ggf. sogar nur eingeschränkte Leserechte auf die Registry besitzt. Um nur lesend auf die Registry zuzugreifen gibt es die Funktion TRegistry.OpenKeyReadOnly.

Weitere Befehle der Klasse TRegistry

TRegistry bietet noch viele weitere Möglichkeiten, die Registry zu bearbeiten.Einen Wert löschen (im aktuell geöffnetem Schlüssel):

DeleteValue('NameDesWertes');

Einen Schlüssel löschen (im aktuell geöffneten Hauptschlüssel – Rootkey):

DeleteKey('Software\Test\Firma\TestProdukt');

Testen, ob ein Schlüssel (relativ vom geöffnetem Schlüssel) oder ein Wert existiert:

Checkbox1.Checked := KeyExists('TestProdukt');
Checkbox2.Checked := ValueExists('TestString');

Weitere Befehle finden Sie in der Online-Hilfe unter dem Stichwort „TRegistry“. Dort ist die komplette Klasse dokumentiert und Beispiele veranschaulichen den Aufruf.