Entwickler-Ecke

Dateizugriff - Inhalt eines Registry-Schlüssels auslesen (AutoStart-Pfad)


Experience1986 - Do 29.01.04 16:11
Titel: Inhalt eines Registry-Schlüssels auslesen (AutoStart-Pfad)
hi,

ich will den Inhalt von HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run auselesen, also alle Windows Autostarts des aktuellen Benutzers, was brrauch ich dafür und was muss ich beachten?

´Hab bereits fleissig Gegoogelt und auch hier im Forum gesucht, aber ohne erfolg.


Chatfix - Do 29.01.04 16:27

Naja vllt hilft dir das? http://www.delphi-forum.de/viewtopic.php?t=2767


teebee - Do 29.01.04 16:32

Wenn man die Werte noch nicht kennt:

TRegistry.GetValueNames(StringListe);

Die OH ist Dein Freund!

Gruß, teebee


Delete - Do 29.01.04 16:39

teebee hat folgendes geschrieben:
Die OH ist Dein Freund!

OH? Oma Hiltrud? :mrgreen:


teebee - Do 29.01.04 16:54

MathiasSimmack hat folgendes geschrieben:
teebee hat folgendes geschrieben:
Die OH ist Dein Freund!

OH? Oma Hiltrud? :mrgreen:

Nee, meine Oma heisst Hertha...:wink:


Experience1986 - Do 29.01.04 17:05

thx, hab es.

Aber wie kann ich zum Teufel in ein ListView (3 Columns: 1=Checkbox; 2=Name; 3=Wert) einen eintrag adden (in name und Wert)????


teebee - Do 29.01.04 17:27


Delphi-Quelltext
1:
2:
3:
4:
5:
Var li: TListItem;
li := ListView1.Items.Add;
li.Caption := 'Erste Spalte';
li.Checked := True;
li.SubItems.Add('Untereintrag');


Gruß, teebee


Experience1986 - Do 29.01.04 17:32

Klasse, funzt auch

Hatte schon ne sau kompliziert Lösung angesteuert, das geht einfach und scheneller *G**


Experience1986 - Do 29.01.04 18:04

Muss nochmal nerven:

Ich hab nuna lees eigentlich wie ich es will, ich habe nun eine Abfrage der einträge in HKEY_LOCAL_MACHINE und in HKEY_CURRENT_USER, leider kommt von HKEY_CURRENT_USER kein Eintrag zurück (In meiner Registry ist aber auch dort einer, bin ich mir sicher)


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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
procedure TFRM_Main.Button4Click(Sender: TObject);
var
  i: integer;
  reg, reg2: TRegistry;
  sl, s2: TStrings;
  li:TListItem;
begin
  reg := TRegistry.Create;
  reg2 := TRegistry.Create;

  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg2.RootKey := HKEY_CURRENT_USER;

  reg.OpenKeyReadOnly('SOFTWARE\Microsoft\Windows\CurrentVersion\Run');
  reg2.OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Run');

  sl := TStringList.Create;
  s2 := TStringList.Create;

  reg.GetValueNames(sl);

  // Alle User - Autostarts
  for i := 0 to sl.Count -1 do
  begin
    li := ListView1.Items.Add;
    li.Caption := '';
    li.Checked := True;
    li.SubItems.Add(sl.Strings[i]);
    li.SubItems.Add(reg.ReadString(sl.Strings[i]));
  end;

  // Aktuelle User - Autostarts
  for i := 0 to s2.Count -1 do
  begin
    li := ListView1.Items.Add;
    li.Caption := '';
    li.Checked := True;
    li.SubItems.Add(s2.Strings[i]);
    li.SubItems.Add(reg.ReadString(s2.Strings[i]));
  end;

  sl.Free;
  s2.Free;

  reg.CloseKey;
  reg2.CloseKey;

  reg.Free;
  reg2.Free;
end;


Was kann also falsch sein?


teebee - Do 29.01.04 18:37

Wie wär's mitreg2.GetValueNames(s2);Das hast Du vergessen.
In der zweiten for-Schleife solltest Du auch lieber reg2 auslesen..

Gruß, teebee


Delete - Do 29.01.04 18:49

Ich frag mich, was das
Zitat:

Delphi-Quelltext
1:
2:
reg := TRegistry.Create;
reg2 := TRegistry.Create;

soll? Und ich sag´s ungern, aber
Zitat:

Delphi-Quelltext
1:
reg.RootKey := HKEY_LOCAL_MACHINE;                    

kann unter NT-Systemen Probleme verursachen, wenn der Benutzer nicht ausreichende Berechtigungen zum Zugriff auf diesen Schlüssel hat. Der Grund liegt im

Delphi-Quelltext
1:
TRegistry.Create                    

bei dem das Registry-Objekt standardmäßig mit vollen Zugriffsrechten erzeugt wird. Und diese Rechte haben unter NT/2000/XP meist nur Benutzer der Admin-Gruppe.

Entweder du nimmst also

Delphi-Quelltext
1:
TRegistry.Create(KEY_READ);                    

was im Fall des Auslesens ohnehin zu empfehlen ist, oder du klammerst beim Start mit eingeschränkten Benutzerrechten den HKLM-Schlüssel aus, falls der User den Autostart auch bearbeiten können soll. Nur der Admin bzw. User dieser Gruppe sollten neben dem persönlichen Autostart auch den maschinenbezogenen Autostart bearbeiten dürfen.


Experience1986 - Do 29.01.04 21:55

Ok, das werd ich mir dann auf jeden fall noch angugen.
(Programmiere zur Zeit nur für mich, zur Übung.)

Nun wollt ich noch was wissen, was aber eher in den VCL Bereich geht, ich hoffe ihr antwortet mir hier trotzdem.

Wie kann ich bei einem TListView herausfinden, welcher "Eintrag" gerade aktiviert ist?

Ich habe bereits per OnSelectItem versuch die Variable "Item" (Wird von dem Ereignis erstellt) so einzusetzen, damit ich zum Beispiel den "Checked" Status des aktuellen Items abfragen kann:


Delphi-Quelltext
1:
2:
3:
4:
if (ListView1.Items[Items].checked) then
begin
...
end;



Aber das funktioniert nicht, da Item von Datentyp TListItem ist und ich ihn nicht so einfach abfragen kann, bin ich überhaupt auf dem richtigen weg?
Wenn ja, dann sagt mir bitte wie ich TListItem's abfragen kann.


teebee - Do 29.01.04 22:25

If ListView1.SelCount>0 Then If ListView1.Selected.Checked Then...Du solltest echt mal 'nen gründlichen Blick in die OH werfen. Nein, ich meine keine Oma sondern die Delphi-Hilfe....

Gruß, teebee


Experience1986 - Do 29.01.04 23:02

THX, in de OH kann man ja manchmal innerhalb von Sekunden was finden, aber andererseits dauert es manchmal stunden....

Immerhin muss man ja wissen nach was man sucht, und dass ist nicht immer gewährleistet.


teebee - Fr 30.01.04 09:13

Experience1986 hat folgendes geschrieben:
Immerhin muss man ja wissen nach was man sucht, und dass ist nicht immer gewährleistet.

Naja, immerhin weisst Du, dass es um TListView geht. Unter Eigenschaften/Methoden findest Du, was Du brauchst. Du kannst auch alle Eigenschaften/Methoden (von TListView und seinen Unterklassen meine ich...) nacheinander durchgehen, und Dir die Beschreibungen zu Gemüte führen, da findet man so allerhand.

Nix für ungut, soll eine Anregung für die Zukunft sein, schließlich hättest Du eine Lösung so viel schneller gefunden als hier im Forum.

Gruß, teebee