Danke für Eure Hilfe (auch
hier) soweit.
Ich vergleiche die Registry mal mit einem Dateisystem. Wenn ich das richtig verstanden habe, dann sind die keys (
GetKeynames
) die (Unter)Verzeichnisse und die values (
GetValueNames
) die Dateien. In den Values sind dann Werte enthalten. Da ich nach einem String suche, war jetzt meine Idee, die Values zu öffnen und die Werte als String auszulesen.
Das klappt aber irgendwie nicht. Ich suche nach einem Wert, der definitiv (jedenfalls lt. regedit) vorhanden ist und er wird trotzdem nicht gefunden.
Aktuell sieht mein Code jetzt so aus:
Delphi-Quellcode:
Procedure TMainForm.SearchReg;
Var
SearchStr : String;
Procedure EnumAllKeys(hkey: THandle; Const RPath: String);
Var
KeyList : TStringList;
ValList : TStringList;
n : Integer;
S, T : String;
lReg : TRegistry;
Begin
With TRegistry.Create Do
Try
RootKey:=hkey;
OpenKeyReadOnly(EmptyStr);
KeyList:=TStringList.Create;
ValList:=TStringList.Create;
Try
GetKeynames(KeyList);
GetValueNames(ValList);
CloseKey;
For n:=0 To Pred(ValList.Count) Do // Einträge durchgehen
Begin
S:=ValList[n];
If Pos(SearchStr, UpperCase(S)) > 0 Then
LBRegistry.Items.Append('[val] ' + RPath + '\' + S);
lReg:=TRegistry.Create; // Einträge selbst auslesen
Try
lReg.RootKey:=hkey;
T:=lReg.ReadString(RPath + '\' + S);
If Pos(SearchStr, UpperCase(T)) > 0 Then
LBRegistry.Items.Append('[con] ' + RPath + '\' + S + '=' + T);
Finally
lReg.Free;
End;
End;
For n:=0 To Pred(KeyList.Count) Do // weitere Keys suchen
Begin
S:=KeyList[n];
If Pos(SearchStr, UpperCase(S)) > 0 Then
LBRegistry.Items.Append('[key]' + RPath + '\' + S);
If OpenKeyReadOnly(S) Then
Begin
EnumAllKeys(CurrentKey, RPath + '\' + S);
CloseKey;
End;
End;
Finally
KeyList.Free;
ValList.Free;
End;
Finally
Free;
End;
End;
Begin
SearchStr:=UpperCase(EDSearch.Text);
LBRegistry.Items.Clear;
LBRegistry.Items.BeginUpdate;
Try
// EnumAllKeys(HKEY_CLASSES_ROOT ,'');
// EnumAllKEys(HKEY_CURRENT_USER ,'');
EnumAllKEys(HKEY_LOCAL_MACHINE ,'');
// EnumAllKEys(HKEY_USERS ,'');
// EnumAllKEys(HKEY_PERFORMANCE_DATA,'');
// EnumAllKEys(HKEY_CURRENT_CONFIG ,'');
// EnumAllKEys(HKEY_DYN_DATA ,'');
Finally
LBRegistry.Items.EndUpdate;
End;
End;