Entwickler-Ecke

Dateizugriff - Fehler bei Registry auslesen


del1312 - Di 03.06.03 18:14
Titel: Fehler bei Registry auslesen
Hi hab mal wieder ein Prob :oops:

Beim Form.Create kommt unteranderem folgender Code der aus der Registry einen Wert lesen soll. Allerdings kommt ne Fehlermeldung weil der Wert wohl noch nicht existiert. Hab versucht das mit try und exept abzufangen, aber es funzt nicht. Kommt immer noch :"Fehler beim holen der Daten aus Autosave" Sollte er eigentlich nicht dann den Wert lesen(entspricht Autosave) auf 1 eintragen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  regist:=TRegistry.Create;
  regist.RootKey:=HKEY_LOCAL_MACHINE;
  try
  regist.OpenKey('SOFTWARE\ECSpooky\Test\Version1.2', true);
  lesen:=regist.ReadInteger('Autosave');
  except
  lesen:=1;
  end
  regist.Free;


Danke für Eure Hilfe!!!
mfg
ecspooky

Moderiert von user profile iconTino: Code- durch Delphi-Tag ersetzt. Titel geändert.


Delete - Di 03.06.03 18:21

Ich schlage folgende Korrektur vor, die ein paar kleinere Problemchen behebt:

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:
// Standardwert festlegen
lesen := 1;

// Registry nur lesen öffnen
// (bitte an NT-Systeme und mangelnde
// Benutzerrechte unter HKLM denken!)
regist:=TRegistry.Create(KEY_READ);
try
  // Root, wie gesagt: HKLM
  regist.RootKey:=HKEY_LOCAL_MACHINE;

  // "OpenKey" ist eine Funktion!
  // da du einen Wert auslesen willst, der
  // da sein SOLLTE/MUSS, bringt das
  // Erzeugen des Schlüssels mit TRUE
  // auch nicht viel, wenn er noch nicht
  // existiert
  if regist.OpenKey('SOFTWARE\ECSpooky\Test\Version1.2',false) then
  begin
    lesen:=regist.ReadInteger('Autosave');

    // Schlüssel schließen
    regist.CloseKey;
  end;
finally
  regist.free;
end;


del1312 - Di 03.06.03 18:27

Oh man vielen vielen Dank für die schnelle und supi erklärten Hilfe!!! :D
Klappt wunderbar, also nochmal DANKE!

Hab noch ne Frage: Wie lösche ich dann wieder die Schüssel ?

mfg
ecspooky


Terra23 - Di 03.06.03 18:56

Löschen machst du mit DeleteKey. Und bei dir wäre auch hilfreich gewesen, wenn du einfach erst dann ausliest, wenn:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Regist:=TRegistry.Create;
Regist.RootKey:=HKEY_LOCAL_MACHINE;
Regist.OpenKey('Software\ECSpooky\Test\Version1.2', True);
If Regist.ValueExists('Autosave'Then
Begin
Try
Lesen:=Regist.ReadInteger('Autosave');
Except
Lesen:=1;
End;
Regist.Free;


.. du es mit einer ValueExists-Abfrage gemacht hättest. :)


del1312 - Di 03.06.03 19:07

Hm aber die Variante darüber ist auch ok oder? Die läuft ja super.

Wegen dem löschen, ist das so ok?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// AutoStart aus Registry löschen ENDE
regist:=TRegistry.Create;
     try
      regist.RootKey:=HKEY_LOCAL_MACHINE
      regist.DeleteKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run\MeinProgramm');
     finally
     regist.Free;
     end;
 // AutoStart aus Registry löschen ENDE
    end;


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Delete - Di 03.06.03 20:04


Delphi-Quelltext
1:
2:
Regist.RootKey:=HKEY_LOCAL_MACHINE; 
Regist.OpenKey('Software\ECSpooky\Test\Version1.2', True);

So und wenn du das alles geschaft hast, dann speicherst du bitte deine Programmeinstellungen in HKCU und nicht HKLM, dann klappt das auch mit dem Schreiben als nicht Admin. :roll:


del1312 - Mi 04.06.03 01:06

Ok das mit HKCU und nicht HKLM ist klar ;o) Nur wie lösche ich jetzt meinen angelegte Zeichenfolge bzw Schlüssel?
Damit klappt es nicht:

Quelltext
1:
regist.DeleteKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run\MeinProg');                    


Delete - Mi 04.06.03 08:20

Ich nehme mal an, dass

Quelltext
1:
SOFTWARE\Microsoft\Windows\CurrentVersion\Run                    

der Schlüssel und

Quelltext
1:
MeinProg                    

der Eintrag (= Value) deines Programms ist. Meinst du, dass man letzteren dann mit DeleteKey entfernen kann? Oder glaubst du, man sollte lieber den Schlüssel öffnen und dann den Eintrag daraus entfernen? :wink:


Terra23 - Mi 04.06.03 13:52

@Mathias: Schon gut, ich gebe mich geschlagen. Vielleicht sollte ich aufmerksamer lesen, dann wäre DeleteKey nicht als Vorschlag rausgekommen, sondern eben die andere Variante zum Löschen von Values. :oops:


Delete - Mi 04.06.03 15:01

Du musst dich nicht entschuldigen. ecspooky hat ja gefragt:
Zitat:
Wie lösche ich dann wieder die Schüssel ?

Unter dem Gesichtspunkt war deine Antwort völlig korrekt, und ich hätte die selbe gegeben. Nur stellte sich dann ja später raus, dass er versucht, den Eintrag seines Programms zu entfernen. Zu dem Zeitpunkt hatte ich also einfach nur mehr Informationen als du einen Tag zuvor. :)

Also, nix für ungut. Meine Kritik richtete sich übrigens auch nicht gegen dich sondern gegen ecspooky, der Schlüssel und Einträge durcheinander bringt.


del1312 - Mi 04.06.03 18:19

also ich fühl mich auch nicht als müßte ich mich entschuldigen oder schämen. ich weiss es halt nicht und deshalb frag ich ja hier :D


Also ich hab in das RegVZ:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\');

ne neue Zeichenfolge mit dem Wert z.B 'C:\Test.exe' Diese möchte ich nun löschen. Kannst du mir da bitte weiterhelfen?

mfg
ecspooky


Delete - Mi 04.06.03 20:01

Ich habe nicht gesagt, dass du dich schämen oder entschuldigen sollst. Du solltest nur deine Fragen von Anfang an verständlich formulieren. Lieber beim Posten Zeit lassen und noch mal Korrektur lesen als irgendwelchen Unsinn hinschmieren, der dann zu Missverständnissen und falschen Antworten führt.

Rein prinzipiell hast du alle Lösungsschritte bereits in den hier vorhandenen Postings drin -

Du weißt wie man einen Registry-Schlüssel öffnet, denn sonst könntest du mit deinem Programm überhaupt keine neue Zeichenfolge anlegen. Das wäre Schritt #1: den gewünschten Schlüssel öffnen.

Dann solltest du den Tipp von Terra23 beherzigen und mit ValueExists prüfen, ob deine Zeichenfolge überhaupt vorhanden ist. Dabei handelt es sich um eine Bool-Funktion, die TRUE oder FALSE zurückliefert.

Ist das Ergebnis TRUE, dann existiert der Eintrag, und du kannst ihn löschen. Und weil es ein Eintrag (= Value) ist, geht das nicht mit DeleteKey ... sondern logischerweise mit DeleteValue.

Gruß.


Terra23 - Mi 04.06.03 21:29

@Mathias: Eines muß ich klar stellen, schnell. Ich fühle mich überhaupt nicht von dir kritisiert und erst Recht nicht angegriffen. Das ist halt so der große Negativ-Punkt, wenn man nicht weiß, wie der andere so spricht. Vielleicht sollte ich ein :mrgreen: dahinter machen. :rofl: Das war nicht böse gemeint, sondern einfach nur als Gag, nach dem Motto: Asche auf mein Haupt. ;-)