Autor Beitrag
Olli_Sahr
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 83


D5 Prof, D7 Architect
BeitragVerfasst: Fr 07.01.05 23:53 
Hallo !

Mit folgendem Source kann ich aus der Registry einen MIR BEKANNTEN Wert auslesen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
var
  RegKey: TRegistry;
  aRegistryKey: String;
  aValue: String;

begin

  RegKey:=TRegistry.Create;
  RegKey.RootKey := HKEY_LOCAL_MACHINE;

  aRegistryKey := 'SOFTWARE\Microsoft\Windows NT\CurrentVersion';
  aValue := 'CurrentBuildNumber';

  Result := RegKey.OpenKeyReadOnly(aRegistryKey);

  if Result and (RegKey.ValueExists(aValue)) then
  begin

      RegKey.ReadString(aValue); // Beispiel, da es hier ein String ist

  end
  else ShowMessage('Can not be read from the Windows-Registry !');

  RegKey.Free;

end;


Wie kann ich aber einen kompletten Baum (z.B. HKEY_LOCAL_MACHINE) auslesen um zu sehen, was da drinnen steht ?
Den kompletten Baum mit allen Untereinträgen meine ich, um zu sehen, welche Schlüssel es in diesem Baum gibt und welche Werte die haben.

Ich will die Bäume HKEY_PERFORMANCE_DATA und HKEY_DYN_DATA auslesen.

Ich weiß, dass ich eine rekirsive Funktion schreiben muss.
Habe mal den Inhalt meiner Fesplatte ausgelesen (alle Dateien und alle Dateien in allen Unterverzeichnissen).

Dazu habe ich mit Findfirst (Source + '\*.*', faAnyFile, Dirinfo); und findnext(dirinfo) Dateien gesucht und wenn ich ein Verzeichnis gefunden habe if (dirinfo.attr and faDirectory <> 0and ((dirinfo.name <> '..'and (dirinfo.name <> '.')) then habe ich die Funktion, in der ich gerae war, einfach noch mal aufgerufen (Rekursion).

Mein Problem ist nicht die Rkursion, sondern wie man in der Registry

- Den atuellen Schlüssel ermitteln kann und den ausgeben kann (Position im BaumKnten)
- Die unter-baumbnoten ermitteln kann
- Ermitteln kann welche Schlüssel der aktuelle Knoten hat

Obald ich den Knoten kenne (z.B. 'SOFTWARE\Microsoft\Windows NT\CurrentVersion') und die Schlüssel (z.B. 'CurrentBuildNumber'), kann ich die auslesen.

Bitte um Hilfe !
Danke

OLLI


P.S.
Wer das Beispiel zum Auslesen der gesamen Felstplatte mit Rekursion braucht, soll es agen, ich poste es dann hier als neuen Beitrag !!!
BJ
Hält's aus hier
Beiträge: 13

Win XP
D7 Pers
BeitragVerfasst: Sa 08.01.05 23:10 
Hi,

In der Registry gibt es 5 Wurzeln (RootKeys): HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS und HKEY_CURRENT_CONFIG. So, diese Roots lädst du der Reihe nach als Reg.RootKey:={ein RootKey}.
Nun beginnt die Rekursion. Du liest mit Reg.GetKeyNames({x: TStringList}) die ersten Unterschlüssel aus und setzt sie in eine dynamische Suchbaumstruktur (z.B. ein B-Baum). Im gleichen Zug liest du die Wertnamen ein, deren Werte du als Blätter des dyn Baumes speicherst. Jetzt beginnt der rekursive Abstieg, indem du als neuen CurrentKey immer die schon vorhandenen Knoten des Baumes setzt und die Routine damit aufrufst. Somit sollten alle Schlüssel und deren Werte erreicht werden. Beim Abspeichern im Baum beachten, dass die gefundenen Keys und Values auch im Baum (durch Suchroutine) an die richtige Stelle gesetzt werden.

Die erstellte Struktur enthält also alle Einträge der Registry. Zum Auslesen einfach den Suchbaum durchlaufen z.B. nach Hauptreihenfolge.

Das Ganze ist zwar komplex im Aufbau, bietet aber den Vorteil keine Komponenten zu benutzen, die Speicher fressen und der Baum nimmt nur soviel Platz ein wie tatsächlich benötigt (vgl. statische Array müssen vordefinierte Größe haben).

Eine andere Möglichkeit wäre die Registry in eine Textdatei zu exportieren (Über ShellExecute regedit.exe /e {Pfad} ausführen) und dann die Textdatei zu durchsuchen. Dan aber die Registry riesig werden kann, wird das auslesen der Datei sehr viel Zeit in Anspruch nehmen. Außerdem benötigt die Textdatei Platz auf der Platte, welcher schon mal in die MB's gehn kann (bei mir warens 60 MB).

_________________
Studium non semper delectat, sed nihil agere delectat.