![]() |
Alle Einträge der Registry z. B. Autostart auslesen.
Hallo, DP
ich bräuchte eine Lösung, um in der Registry z.B. alle Programme aus der HKEY_LOCAL_MACHINE\ Software\ Microsoft\ Windows\ CurrentVersion\ Run in ein openarray einzulesen. Hat da jemand Codeschnipsel für die DP und mich? |
Re: Alle Einträge der Registry z. B. Autostart auslesen.
Schau dir mal die Klasse TRegistry an.
|
Re: Alle Einträge der Registry z. B. Autostart auslesen.
@mkinzler
Danke für die Antwort. Meine Frage bezieht sich aber auf a l l e Einträge eines Schlüssels á la //Pseudocode! Count:=CountSchlüssel('HKEY_LOCAL_MACHINE\Software \Microsoft\Windows\CurrentVersion\ Run'); for i=1 to Count do begin // Lese in openarray ein... end; Lösungen für einen Schlüssel gibt es massenweise. Es können ja. z. B. mehrere Services, RunOnce, Run etc.vorhanden sein. Einen Count(Schlüssel) o.ä. konnte ich in der TRegistry nicht finden. |
Re: Alle Einträge der Registry z. B. Autostart auslesen.
Z.B. Mit Reg.GetValueNames(StringList); oder für alle Werte Reg.GetKeyValues(StringList);
Florian |
Re: Alle Einträge der Registry z. B. Autostart auslesen.
@Florian Bernd
Danke, Florian. Mit der Delhihilfe habe ich sogar ein Beispiel gefunden. Das versuche ich mal umzusetzen. :corky: |
Re: Alle Einträge der Registry z. B. Autostart auslesen.
So, ich habe es!
Zwar nicht in ein OpenArray sondern in eine TStringlist, das ist sogar besser (Siehe Code unter Debug) Ich bekomme, wenn ich die Zeile Val.free einsetze, (mit Try oder ohne Try...finally..end) eine EAccessviolation Meldung. -> Was mache ich falsch? Ganz unten das Beispiel aus der DelphiHilfe, da funktioniert es. Hier mein Code/meine Lösung: Nachtrag: Gelöst dank Björn, siehe Code hier:
Delphi-Quellcode:
::::: Hier das Beispiel aus der Delphi Hilfe...
...uses Registry
//Meine Lösung... function CountKey(Rootkey:HKEY;Key:String):Integer; VAR Reg: TRegistry; Val: TStringList; i: Integer; begin // INIT Result:=0; Reg:=TRegistry.Create; //INITEND //Hauptteil: try Val:=TStringList.Create; reg.RootKey:=Rootkey; if not Reg.OpenKey(Key,False) then ShowMessage('Error opening key') else begin Reg.GetValueNames(Val); //ONLY FOR DEBUG Zur INFO: (* einfach durch //(* ersetzen und sehen was passiert! (* for I:=0 to Val.Count-1 do begin ShowMessage(Key+ Chr(13) +'hat einen Eitrag'+Val.Strings[I]+Chr(13)+ 'mit '+Reg.ReadString(Val.Strings[I])); end;//ENDFOR *) //DEBUGEND end;//ELSE // EDIT Das ist der alte Code der nicht funtionierte (* finally //Hier gibt es ein Error!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Val.free; end; Reg.free; //Hier das Ergebnis der Suche Result:=Val.Count; // Alter Code ENDE *) // EDIT So ist es richtig! Result:=Val.Count; finally Val.free; end; Reg.free; end; //Aufruf mit... procedure TForm1.Button1Click(Sender: TObject); var RootKey:HKEY; key:String; begin RootKey:=HKEY_LOCAL_MACHINE; key:='\Software\Microsoft\Windows\CurrentVersion\Run'; showmessage(inttostr(countkey(RootKey,key))); end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Reg: TRegistry; Val:TStringList; I:Integer; begin Reg:=TRegistry.Create; try Val:=TStringList.Create; try Reg.RootKey:=HKEY_LOCAL_MACHINE; // Abschnitt in Registrierung if not Reg.OpenKey(Edit1.Text,False) then ShowMessage('Error opening key') else begin Reg.GetValueNames(Val); for I:=0 to Val.Count-1 do begin ShowMessage(Edit1.Text + Chr(13) + 'has an Entry Called '+Val.Strings[I]+Chr(13)+ 'With a Value of '+Reg.ReadString(Val.Strings[I])); end; if MessageDlg('Ok to delete the key and lose all these values?' ,Mtinformation,[mbYes,mbNo],0)=mryes then Reg.DeleteKey(Edit1.Text); end; finally Val.Free; end; finally Reg.Free; end; end; |
Re: Alle Einträge der Registry z. B. Autostart auslesen.
Delphi-Quellcode:
Von einen freigegeben objekte kanst du nichts verlangen
//Hier gibt es ein Error!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Val.free; end; Reg.free; //Hier das Ergebnis der Suche Result:=Val.Count;
Delphi-Quellcode:
//Hier gibt es ein Error!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Result:=Val.Count; Val.free; end; Reg.free; //Hier das Ergebnis der Suche |
Re: Alle Einträge der Registry z. B. Autostart auslesen.
@Björn
"Vor dem Kopfschlag" Logisch! Vielen Dank. @Alle Danke für die schnellen Antworten. :spin2: |
Re: Alle Einträge der Registry z. B. Autostart auslesen.
Ich glaube es gehört noch in diesen Thread:
Die Lösung mit GetValueNames klappt bei 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servi ces' leider nicht. Als Eintrag wird leider 0 wiedergegeben. Der Aufruf eines Keys mit einem unter Services versehenen Unterordner bzw. Dienstes/Treiber zeigt die entsprechende Anzahl und Einträge korrekt an. Auch 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Cur rentVersion\Run' wird ohne Probleme angezeigt. Vielleicht hat ja jemand eine Lösung zur Ergänzung, wie ich die Einträge unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es doch zählen und listen kann. Ich möchte die Einträge auf Änderungen überwachen können. |
Re: Alle Einträge der Registry z. B. Autostart auslesen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz