Entwickler-Ecke
Dateizugriff - Registry killer
patrick - So 13.10.02 12:33
Titel: Registry killer
hi zusammen
ich glaub ich hab aus versehen n registry-killer programmiert.
nachdem ich folgenden quellcode in eine Tbutton aktion eingebunden hab hats bei mir den
gesamten registry gelöscht und windows startete nicht mehr. nun hab seit ich
freitag 19 uhr per dos eine alte backup .reg - datei aufgespielt. importierdauer 35stunden!!!!!!!!!!!!!
folgende (gedachte) funktion sollte der code auslösen:
-listboxitem-index auslesen (das ist die variable regdelitem)
-den gleichnamigen registry schlüssel aus dem registry laden in dem der zu löschende pfad enthalten sein soll (variabel regdelpath)
- den zu löschenden pfad löschen
und bammmm
alles am a..... :evil: :x
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| reg:=Tregistry.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey('software\N@traxx\Prog533215\',true); reg.DeleteKey(inttostr(regdelitem)); regdelpath:=reg.ReadString(inttostr(regdelitem)); reg.CloseKey; reg.DeleteKey(regdelpath); finally reg.closekey; end; reg.free; |
nun die frage was war denn das problem :?: :?:
is sowas schon mal jemanden anderen passiert??
wer will kan den code ja mal ausprobieren.
würd ich aber nur mit backup raten!! :wink:
CU
littlemike1005 - So 13.10.02 12:50
Titel: Rechner?
was hast du für einen rechner????
xt mit 4,77 Mhz oder so das es 35 Stunden dauert????? was hast du gemacht?
mir ist so was noch nie passiert weil ich mach noch nichts mit der registry. aber mein beileid zur verstorbenen regestry
Christian S. - So 13.10.02 13:19
Hi!
Ich habe noch nie so richtig mit der Registry gearbeitet, aber dieser Code
Quelltext
1: 2:
| reg.DeleteKey(inttostr(regdelitem)); regdelpath:=reg.ReadString(inttostr(regdelitem)); |
könnte doch eigentlich einen ziemlichen Fehler produzieren. Wenn ich das richtig sehe, willst Du etwas lesen, dass schon längst gelöscht ist. Und wenn ich Dich richtig verstanden habe, soll der doch gar nicht gelöscht werden, sondern nur gelesen werden, oder?
MfG,
Peter
Delete - So 13.10.02 16:02
Nicht zwangsläufig, Peter. Wenn "regdelitem" einen Wert enthält (und das kann -laut der Funktionsbeschreibung- ja nur ein Integer sein = ItemIndex der Listbox), dann würde die Zeile
Quelltext
1:
| reg.DeleteKey(inttostr(regdelitem)); |
versuchen, einen Schlüssel innerhalb des geöffneten zu löschen. Das dürfte also nicht die gesamte Registry betreffen, da patrick ja den Schlüssel
Quelltext
1:
| software\N@traxx\Prog533215 |
geöffnet hat.
Aber in einem Punkt hast du recht: viel Sinn macht der Code in der vorliegenden Form nicht. Ich tippe mal, dass der Fehler hier liegen dürfte:
Quelltext
1: 2: 3:
| regdelpath:=reg.ReadString(inttostr(regdelitem)); reg.CloseKey; reg.DeleteKey(regdelpath); |
Wenn "regdelpath" einen Leerstring enthält -weil z.B. der gesuchte Eintrag nicht gefunden wurde- dann gibt´s beim Löschen (letzte Zeile) ein enormes Problem, weil vorher der aktuelle Schlüssel (s. oben) geschlossen wurde.
Ausprobiert habe ich´s nicht -will ich auch irgendwie nicht. :evil:- aber ich könnte mir vorstellen, dass sich die Löschfunktion dann auf die komplette Registry bezieht :!:
patrick - So 13.10.02 16:44
ok anscheinend hab ich mich ein bisschen undeutlich ausgedrückt :oops:
also
in einer listbox sind verschiedene items aufgeführt
wenn der user jetzt ein item auswählt wird der itemindex abgefragt welcher in der variable "delregitem" gespeichert wird.
der gleichnamige schlüssel in dem ordner( zb itemindex1 ist der schlüssel "1")
Quelltext
1:
| software\N@traxx\Prog533215 |
aufgerufen(ich nenn ihr jetzt xy).
"xy" enthält wiederum den wert "delregpath" für den key der gelöscht werden soll.
aber ihr habt recht:
Quelltext
1:
| reg.DeleteKey(inttostr(regdelitem)); |
gehört hinter die abfrage
kann das sein das das schon der fehler war??
@littlemike1005
mein pc: Athlon XP 1600+
256MB DDR-RAM
60G fest.
schnell genug??
littlemike1005 - So 13.10.02 17:12
Titel: Schnell genug
Aber was braucht es so lange (35 Std.??) Was macht Windows da.
Delete - So 13.10.02 17:45
patrick hat folgendes geschrieben: |
kann das sein das das schon der fehler war |
Nein. In deiner Idee steckt der Fehler. Du schreibst:
Zitat: |
zb itemindex1 ist der schlüssel "1" (...) ich nenn ihr jetzt xy |
und greifst mit
Quelltext
1:
| regdelpath:=reg.ReadString(inttostr(regdelitem)); |
auf die Registry zu. "regdelitem" enthält aber den Index des gewählten Items - um bei deinem Beispiel mit der Eins zu bleiben: es wird nach dem Schlüssel
Quelltext
1:
| software\N@traxx\Prog533215\1 |
gesucht. Demzufolge liefert "delregpath" einen Leerstring zurück. Im nächsten Schritt schließt du den aktuellen Schlüssel und löscht dann den, den du scheinbar (!) gelesen hast. Weil der leer ist, du dich aber in HKEY_LOCAL_MACHINE befindest, radierst du deine Registry zumindest teilweise aus.
Problem erkannt :!:
Du solltest also eine Korrektur und zwei Sicherheitsabfragen einbauen. Die Korrektur betrifft deinen falschen Ansatzpunkt. Wenn du wissen willst, wie der aktuell gewählte Eintrag in der Listbox heißt, dann hilft dir der Index zwar weiter - allerdings so:
Quelltext
1:
| delregpath := reg.ReadString(ListBox1.Items[ListBox1.ItemIndex]); |
Des Weiteren solltest du die Prozedur unbedingt abbrechen, wenn die Stringvariable keinen Wert enthält, und zu guter Letzt sollte eine Abfrage vorhanden sein. Es könnte also so aussehen:
Quelltext
1: 2: 3: 4:
| if(delregpath <> '') then if(MessageBox(0,pchar(Format('Wollen Sie den Schlüssel "%s" wirklich löschen?',[delregpath])), nil,MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2) = ID_YES) then reg.DeleteKey(delregpath); |
patrick - Mo 14.10.02 12:34
ich versuchs
ich kann ja zusätlich noch checken ob die registry befehle true zuückgeben.
THX
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!