Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Regestry durchscannen (https://www.delphipraxis.net/36180-regestry-durchscannen.html)

gsh 16. Dez 2004 19:48


Regestry durchscannen
 
Hi DPler

Ich wollte mal die Regestry durchscannen und alle Schlüssel mit Value auslesen und in eine Datei schreiben. Mit allen HKEY ist des auch wundervoll gegangen nur nicht mit HKEY_LOCAL_MASCHINE. Ich glaube weil in dem HKEY zu viele Werte stehen und ich auf meine Variante einen Stack überlauf bekomme:

Code:
procedure TForm1.Search_Reg(Root : HKEY; Dir : String; var Liste : TStringList);
var
  reg : TRegistry;
  List, List2 : TStringList;
  I, I2 : Integer;
begin
  Application.ProcessMessages;
  sleep(0);
  Reg := TRegistry.Create;
  try
    reg.RootKey := Root;
    if reg.OpenKey(Dir, false) = false then exit;
    List := TStringList.Create;
    List2 := TStringList.Create;
    reg.GetKeyNames(List);
    reg.GetValueNames(List2);
    for I := 0 to List.Count-1 do
    begin
      Liste.Add(Dir+'\'+List[I]);
      for I2 := 0 to List2.Count-1 do
      begin
        Liste.Add(Dir+'\'+List[I]+'\'+List2[I2]{+'='+reg.ReadString(List[I2])});
      end;
      Search_Reg(Root, Dir+'\'+List[I], Liste);
    end;
  finally
    reg.Free;
  end;
end;
Es ist mir klar des es nicht die schönste Variante mit den ganzen fors ist aber ich wüsste ich nicht wie ich es anders machen könnte. :wall:

Vieleicht könntet ihr mir auch ein stückchen Code preisgeben.


gsh

[edit=Christian Seehase]Pushen erst nach 24 Stunden :!: Mfg, Christian Seehase[/edit]

DP-Maintenance 16. Dez 2004 23:20

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Windows 9x / ME / 2000 / XP / 2003" nach "Windows API" verschoben.
Es ist ein Programmierproblem

gsh 17. Dez 2004 21:28

Re: Regestry durchscannen
 
Hat den keiner eine Idee ?

Assarbad 26. Dez 2004 14:45

Re: Regestry durchscannen
 
Von welchem Betriebssystem reden wir denn?

fkerber 26. Dez 2004 14:47

Re: Regestry durchscannen
 
Hi!

Welcher Fehler kam denn bei deinem Versuch? Und an welcher Stelle des Codes?


Ciao Frederic

gsh 28. Dez 2004 19:01

Re: Regestry durchscannen
 
@Assarbad : Win XP SP2

@fkerber : Das Problem ist mit den vielen for schleifen den die Function ruft sich selber wieder auf (um die unterverzeichnisse zu erstellen). Bei for schleifen merkt sich das betriebsystem dir rücksprungadresse im Stack und deshalb bekomme ich einen Stack-Überlauf.

PS: Wenn ich die Function nicht wieder selber aufrufen lasse dann geht alles nur hat er dann keine unterverzeichnisse. :wall:

Assarbad 28. Dez 2004 23:22

Re: Regestry durchscannen
 
Code:
  reg : TRegistry;
  List, List2 : TStringList;
Jede Instanz der Funktion hat ein eigenes Registry-Objekt, hat zwei eigene Stringlists, sorry, da wunderst du dich? Sowas sollte man als Parameter übergeben um den Stackframe klein zu halten.

jim_raynor 29. Dez 2004 07:18

Re: Regestry durchscannen
 
Ich würde es auf eine Iterative Funktion umbauen, ist auch garnicht weiter wild.

1. Du erstellst eine StringListe in der alle zu verarbeitenden Schlüssel abgelegt werden.
2. Du fügst der Liste den Root Pfad (vermutlich '/' oder '' hinzu)
3. Du nimmst den ersten Schlüssel aus der Stringliste und öffnest diesen
4. Du ermittelst alle direkten Unterschlüssel. Diese fügst du ans Ende der Stringliste ein. Natürlich mit Kompletten Pfad (also '/Software/Microsoft' ... usw).
5. Zu dem geöffneten Schlüssel gibts du die ganzen Values aus.
6. Du löschst den ersten Eintrag aus der Stringliste.
7. Du springst zurück zu Punkt 3 und machst das solange, bis kein Schlüssel mehr in der Stringliste steht.

Wenn man etwas Hierachie in die Ausgabedatei bringen möchte kannst du bei Punkt 4 den neuen Schlüssel auch nach dem Ersten Eintrag einfügen. Dann wird der neue Schlüssel nach dem aktuellen abgearbeitet.

Shaman 29. Dez 2004 07:35

Re: Regestry durchscannen
 
Hoi

Zitat:

Zitat von Assarbad
Jede Instanz der Funktion hat ein eigenes Registry-Objekt, hat zwei eigene Stringlists, sorry, da wunderst du dich? Sowas sollte man als Parameter übergeben um den Stackframe klein zu halten.

Ich dachte, Objekte werden nicht auf dem Stack erstellt?

Gruss
Shaman

Assarbad 29. Dez 2004 09:48

Re: Regestry durchscannen
 
Gut, Objekte selber nicht (nur die Objektpointer liegen aufm Stack). Aber es reicht für eine außerordentliche Belastung des Speichers. IMO sollte er erstmal dahingehend etwas korrigieren.

Wenn's dann immer noch nicht geht, kann man noch weiter gehen. Außerdem wäre eine solche Funktion bei mir keine Methode. So muß nämlich auch noch der Self-Pointer mitgeschleppt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 Uhr.
Seite 1 von 2  1 2      

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