Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Registry-Schlüssel löschen (https://www.delphipraxis.net/28393-registry-schluessel-loeschen.html)

Luckie 24. Aug 2004 11:45


Registry-Schlüssel löschen
 
Alsoooooo:
Ich speichere die Einstellungen von meinen Programmen in ein einem Unterschlüssel von: 'HKCU\Software\MichaelPuff'. In dem Programmen baue ich eine Routine ein, die die Programmeinstellunegn wieder löschen soll. Kein Problem so weit. Jetzt kann es aber vorkommen, dass mehrere von meinen Programmen ihre Einstellungen dort speichern. Das sähe dann so aus:
Code:
HKCU\Software\MichaelPuff
  Programm1
  Programm2
Löscht jetzt das letzte Programm seine Einstellungen aus meinem Schlüssel, soll es auch den leeren Schlüssel 'MichaelPuff' löschen. Und das klappt irgendwie nicht. Ich bekomme an der betreffenden Stelle im Code immer 'Zugriff verweigert' zurück.

Hier mein Code:
Delphi-Quellcode:
function DelRegSettings(const CompanyKey, SubKey: String): Boolean;
var
  reg: TRegistry;
  bRes: Boolean;
  sl: TStringList;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_CURRENT_USER;
    bRes := reg.KeyExists(CompanyKey);
    if bRes then
    begin
      bRes := reg.OpenKey(CompanyKey, False);
      if bRes then
      begin
        sl := TStringList.Create;
        try
          reg.GetKeyNames(sl);
          if sl.IndexOf(SubKey) <> -1 then
          begin
            bRes := reg.DeleteKey(SubKey);
          end;
        finally
          FreeAndNil(sl);
        end;
        reg.CloseKey;
      end;
      bRes := Reg.OpenKey(CompanyKey, False);
      if bRes then
      begin
        sl := TStringList.Create;
        reg.GetKeyNames(sl);
        //#TODO1: Hier stimmt noch was nicht!!!
        if sl.Count = 0 then
        begin
          bRes := reg.DeleteKey('MichaelPuff'); //  <- 'Zugriff verweigert!!!
          // Test
          ShowMessage(SysErrorMessage(GetLasterror));
        end;
        reg.CloseKey;
      end;
    end;
  finally
    FreeAndNil(reg);
  end;
  result := bRes;
end;
Was mache ich falsch? Ich bekomme es einfach nicht hin. :?

Stevie 24. Aug 2004 12:12

Re: Registry-Schlüssel löschen
 
Du musst das reg.CloseKey vor das reg.DeleteKey schreiben, weil geöffnete Schlüssel nicht gelöscht werden können!

Luckie 24. Aug 2004 12:17

Re: Registry-Schlüssel löschen
 
Hatte ich auch schon gedacht. Und ich meine es auch schon so probiert zu haben.
Delphi-Quellcode:
      bRes := Reg.OpenKey(CompanyKey, False);
      if bRes then
      begin
        sl := TStringList.Create;
        reg.GetKeyNames(sl);
        reg.CloseKey; // <- CloseKey hier!!!
        //#TODO1: Hier stimmt noch was nicht!!!
        if sl.Count = 0 then
        begin
          bRes := reg.DeleteKey('MichaelPuff');
          // Test
          ShowMessage(SysErrorMessage(GetLasterror));
        end;
      end;
Geht auch nicht. 'Zugriff verweigert'.

Stevie 24. Aug 2004 12:22

Re: Registry-Schlüssel löschen
 
Du musst ja auch bRes := reg.DeleteKey(CompanyKey); schreiben!!!

Luckie 24. Aug 2004 12:28

Re: Registry-Schlüssel löschen
 
Autsch. Zu meiner Entschuldigung: Es war schon spät und ich hatte schon eine halbe Flasche Sekt getrunken. :mrgreen:

Stevie 24. Aug 2004 12:30

Re: Registry-Schlüssel löschen
 
Zitat:

Zitat von Luckie
Autsch. Zu meiner Entschuldigung: Es war schon spät und ich hatte schon eine halbe Flasche Sekt getrunken. :mrgreen:

Die scheinbar immernoch wirkt!!! :mrgreen: :drunken:

Luckie 24. Aug 2004 12:46

Re: Registry-Schlüssel löschen
 
Für die CodeLib noch mal komplett: Denkt euch irgendeinen aussagekräftigen Titel aus, mir fällt keiner ein. :?

Was die Funktion macht, steht oben im ersten Post und ist, denke ich, universell einsetztbar, wenn man seine Einstellungen aus der Registry löschen will. Ich habe sie noch etwas verbessert und optimiert.

Delphi-Quellcode:
function DelRegSettings(const CompanyKey, SubKey: string): Boolean;
var
  reg: TRegistry;
  bRes: Boolean;
  sl: TStringList;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_CURRENT_USER;
    // gibt es was zu löschen?
    bRes := reg.KeyExists(CompanyKey);
    if bRes then
    begin
      // Schlüssel öffnen
      bRes := reg.OpenKey(CompanyKey, False);
      if bRes then
      begin
        sl := TStringList.Create;
        try
          // Subkeys holen
          reg.GetKeyNames(sl);
          // ist zu löschender Schlüssel vorhanden?
          if sl.IndexOf(SubKey) <> -1 then
          begin
            bRes := reg.DeleteKey(SubKey);
          end;
          // Liste mit Subkeys löschen
          sl.Clear;
          // noch mal alle Subkeys holen
          reg.GetKeyNames(sl);
          reg.CloseKey;
          // keine Subkeys
          if sl.Count = 0 then
            bRes := reg.DeleteKey(CompanyKey);
        finally
          FreeAndNil(sl);
        end;
      end; // OpenKey
    end; // KeyExists
  finally
    FreeAndNil(reg);
  end;
  result := bRes;
end;
CompanyKey steht zum Beispiel für 'HKCU\Software\MeineFirma' und SubKey entsprechend dann für den Programmnamen der Firma.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz