Die Registry öffnen


Die installierte Software befindet sich, wie Sie sicher wissen, im Schlüssel

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall


Zum Öffnen dieses Schlüssel benutzen wir die Funktion RegOpenKeyEx. Die Funktion erwartet zunächst einen Root-Schlüssel. Das kann ein zuvor geöffneter Registryschlüssel sein, oder einer der fünf vordefinierten und bekannten Schlüssel. Auf einen solchen müssen wir in dem Fall natürlich zurückgreifen, da wir bisher noch nichts geöffnet haben

if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,

Der nächste Parameter ist der gewünschte Pfad. Das Beispiel benutzt hier zwar eine Konstante, aber zur besseren Übersicht soll hier der tatsächliche Pfad genannt werden

  'Software\Microsoft\Windows\CurrentVersion\Uninstall',

Der nächste Parameter ist reserviert und daher Null

  0,

Nun geben wir an, wie wir auf den Schlüssel zugreifen wollen. Ausgehend von der Tatsache, dass wir die Namen der installierten Software nur lesen aber nicht ändern wollen, genügt uns hier die Option

  KEY_READ,

KEY_READ ist ohnehin aus Sicherheitsgründen vorzuziehen. Da mit Windows XP allmählich ein System auf NT-Basis im Heimbereich Verbreitung findet, darf die Rechte-Frage meiner Meinung nach nicht außer Acht gelassen werden. Bei 9x-Systemen kann im Prinzip jeder Benutzer alles machen; Gutes wie Schlechtes. Bei NT-Betriebssystemen entscheiden die Rechte darüber, was ein Benutzer darf und was nicht. Im Normalfall hat auch nur ein Administrator vollen Zugriff auf den Schlüssel HKEY_LOCAL_MACHINE. Nun ist aber nicht auszuschließen, dass ein "normaler" Benutzer das Programm startet. Wenn Ihr Programm z.B. davon abhängig ist, Daten aus diesem Schlüssel zu lesen und in diesen zu speichern, dann sollten Sie es beenden, wenn keine ausreichenden Rechte vorhanden sind.
In unserem Fall kann diese Prüfung vernachlässigt werden, da wir hier die Daten ja nur lesen wollen. Und dafür genügt die o.g. Option.

Der letzte Parameter ist eine HKEY-Variable, die das Handle des geöffneten Schlüssels enthält. Diese Variable nutzen wir für die folgenden Lese- und (in anderen Fällen!) Schreibzugriffe.

  rgHandle) = ERROR_SUCCESS) then
try
  { ... }
finally
  RegCloseKey(rgHandle);
end;


Neben der Prüfung, ob der Zugriff (in dem Fall: das Öffnen des Schlüssels) erfolgreich war, empfiehlt es sich, die nun folgenden Anweisungen in einen try-finally-Block einzuklammern. Im Fehlerfall wird der Schlüssel dann wenigstens noch mit

RegCloseKey(rgHandle);

geschlossen.


Die wichtigsten Zugriffsrechte

Wert Bedeutung
KEY_READ kombiniert die Standardrechte (DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, SYNCHRONIZE) mit KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS und KEY_NOTIFY
KEY_QUERY_VALUE erforderlich um Werte auslesen zu können
KEY_ENUMERATE_SUB_KEYS erforderlich um vorhandene Schlüssel "aufzählen" zu können
KEY_WRITE kombiniert die Standardrechte mit KEY_SET_VALUE und KEY_CREATE_SUB_KEY
KEY_SET_VALUE erforderlich um einen Registrywert erzeugen, löschen oder ändern zu können
KEY_CREATE_SUB_KEY erforderlich um einen Schlüssel anlegen zu können
KEY_ALL_ACCESS kombiniert die Standardrechte mit den Rechten von KEY_READ und KEY_WRITE sowie mit KEY_CREATE_LINK

Hinweis

Wenn Sie die "Registry"-Unit verwenden, wird die Registry durch einen Aufruf von

reg := TRegistry.Create;
{ ... }

standardmäßig mit KEY_ALL_ACCESS geöffnet. Das kann, insbesondere auf NT-Systemen, zu den bereits geschilderten Rechte-Problemen führen, wenn Sie auf Schlüssel zugreifen, die nicht für jeden Benutzer zugänglich sind. Aber auch hier lässt sich ein anderes Zugriffsrecht verwenden. Es wird auch in der Delphi-Hilfe erwähnt, nur in den meisten Fällen leider überlesen oder sogar ignoriert. Unser API-Beispiel vom Anfang könnte z.B. so aussehen:

reg := TRegistry.Create(KEY_READ);
with reg do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    if(OpenKey('Software\Microsoft\Windows\CurrentVersion\Uninstall',
      false)) then
    try
      { ... }
    finally
      CloseKey;
    end;
  finally
    reg.Free;
  end;