Autor Beitrag
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: So 13.10.02 12:33 
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

ausblenden 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

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
littlemike1005
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 13.10.02 13:19 
Hi!

Ich habe noch nie so richtig mit der Registry gearbeitet, aber dieser Code
ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ausblenden 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
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: 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")
ausblenden 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:
ausblenden 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??

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
littlemike1005
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187



BeitragVerfasst: So 13.10.02 17:12 
Titel: Schnell genug
Aber was braucht es so lange (35 Std.??) Was macht Windows da.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ausblenden 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
ausblenden 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:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Mo 14.10.02 12:34 
ich versuchs

ich kann ja zusätlich noch checken ob die registry befehle true zuückgeben.

THX

_________________
Patrick
im zweifelsfall immer das richtige tun!!!