Um einen Registryschlüssel zu löschen benötigen wir nur die Funktion
Das Beispielprogramm fragt deshalb vor dem Löschen eines Schlüssels nach und zeigt auch den zu löschenden Schlüssel an. Ich gehe davon aus, dass Sie wissen was Sie tun. Als Anwender sollten Sie vor dem Löschen genau lesen und nachdenken ob es wirklich der Schlüssel ist, den Sie entfernen wollen. Als Entwickler stehen Sie meiner Meinung nach an diesem Punkt in der Pflicht, so viele Informationen wie möglich zu liefern. Anstelle des bloßen Schlüsselnamens sollten Sie daher den kompletten Pfad angeben. Und Sie sollten auch die Abfrage von Anfang an auf Nein einstellen, für den Fall, dass ein User versehentlich auf Enter drückt. Im Programm sieht das so aus:
if(MessageBox(0, pchar('Wollen Sie den Schlüssel "' + szUnInst + '\' + buffer + '" wirklich entfernen?'), 'UnInstall Secrets', MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2) = ID_YES) then begin end;
Das Programm präsentiert Ihnen den kompletten Pfad und stellt außerdem mit MB_DEFBUTTON2 den zweiten Button der Dialogbox als aktiv ein; in dem Fall wäre das der "Nein"-Button, und damit sind Sie auf der sicheren Seite.
Haben Sie sich entschieden, den Schlüssel zu löschen, rufen Sie die o.g. Funktion auf und geben zuerst das Handle eines evtl. übergeordneten Schlüssels an (in unserem Fall HKEY_LOCAL_MACHINE als Root) und natürlich den Namen des zu löschenden Pfades:
if(RegDeleteKey(HKEY_LOCAL_MACHINE,
pchar(szUnInst + '\' + buffer)) = ERROR_SUCCESS) then
ListView_DeleteItem(hListview,i);
Im Erfolgsfall wird der Schlüssel dann auch gleich aus der List-View entfernt.
Unter NT, 2000 und XP darf der zu löschende Schlüssel allerdings keine Unterschlüssel haben! Im Fall unseres Beispiels sollte das keine Rolle spielen, da Einträge von installierter Software normalerweise keine Unterschlüssel haben ... Aber: sicher ist sicher. Also ändern wir den o.g. Code um und benutzen eine neue Prozedur. Die öffnet den jeweiligen Schlüssel, prüft ihn auf die Existenz möglicher Unterschlüssel und ruft sich in dem Fall selbst wieder auf:
// Schlüssel öffnen if(RegOpenKeyEx(parent,@szKeyName[1],0,KEY_READ,reg) = ERROR_SUCCESS) then try // Anzahl der Unterschlüssel herausfinden if(RegQueryInfoKey(reg,nil,nil,nil,@dwSubKeys,nil, nil,nil,nil,nil,nil,nil) = ERROR_SUCCESS) and // es sind mehr als Null (dwSubKeys > 0) then for i := 0 to dwSubKeys - 1 do begin ZeroMemory(@buf,sizeof(buf)); dwLen := MAX_PATH;
// jeden Schlüsselnamen auslesen if(RegEnumKeyEx(reg,i,buf,dwLen,nil,nil,nil,nil) = ERROR_SUCCESS) and (dwLen > 0) then // und die Funktion neu aufrufen DelRecurse(reg,buf); end; finally RegCloseKey(reg); end;
Sind keine weiteren Schlüssel vorhanden, wird der jeweils aktuelle geschlossen (natürlich!) und dann mit
Result := RegDeleteKey(parent,@szKeyName[1]);
gelöscht.