![]() |
Autostart: Wieso funktioniert der Code nicht ?!?
Hiho ...
will in mein Programm einen Autostart einbauen! Ich finde meinen Fehler aber nicht!!! (also der Compiler meckert auch nicht) :
Code:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var reg: TRegistry; begin if CheckBox1.checked = true then begin reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Trouble_Maker\Secure\', true); reg.WriteInteger('Autostart', 1); end else reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Trouble_Maker\Secure\', true); Reg.DeleteValue('Autostart'); end;
Code:
procedure TForm1.FormCreate(Sender: TObject);
var Reg: TRegistry; begin //Autostart try reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Trouble_Maker\Secure\', true); if reg.ValueExists('Autostart') then begin CheckBox1.checked := true; end; except free; end; end;
Code:
so ... also
procedure TForm1.CheckBox1Click(Sender: TObject);
var Reg: TRegistry; begin if CheckBox1.checked = true then begin Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); Reg.WriteString('Security-Tool.exe', ParamStr(0)); Reg.Destroy; end; if CheckBox1.checked = true then begin Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); Reg.DeleteValue('Security-Tool.exe'); Reg.Destroy; end; end; 1. Auch wenn ich das Programm im Autostart habe, zeigt er nicht bei der Checkbox einen Haken. 2. Wenn ich den Autostart mit der Checkbox ausschalte (keinen Haken) dann startet das Programm trotzdem !!! woran liegt das ?!? danke cu Trouble_Maker |
Liegt der Fehler daran das du 2x
Code:
im letzten Code-Abschnitt geschrieben hast?
CheckBox1.checked = true then
|
hi ...
@Uncle Cracker: Stimmt! Habe aus Versehen anstatt false noch einmal true geschrieben !!! Doch leider funktioniert es trotzdem noch nicht :-( Weiss echt nich wieso. Trouble_Maker |
hmm ...
hat keiner mehr einen Lösungsvorschlag ?!? wäre cool, wenn ihr mir helfen könntet! Denn ich weiss einfach absolut nicht, wieso der Code nicht runktioniert !!! danke Trouble_Maker |
Moin Trouble Maker,
zu Deinen Code Schnipseln fällt mir 'ne ganze Menge ein: Zum einen warum es nicht funktioniert: Vermutlich befindet sich im Programmpfad ein Leerzeichen. Du müsstest nicht paramstr(0) in den Key schreiben, sondern '"'+paramstr(0)+'"'. Dann vermisse ich in den ersten beiden Abschnitten die Freigabe des Reg Objektes und überall das Schliessen des Keys. (try/finally Blöcke wären auch gut) Als nächstes prüfst Du nirgends, ob das was Du da gemacht hast auch funktioniert hat. Ob ein OpenKey den Key überhaupt geöffnet hat wird nicht geprüft, und dank Deines Try/Except Blockes würde auch nie eine Exception in diesem Bereich auffallen. Ausserdem kannst Du leicht unnötigen Code vermeiden: Der letzte Abschnitt könnte auch so aussehen:
Delphi-Quellcode:
Aufpassen solltest Du noch beim Zuweisen eines Wertes an CheckBox.Checked, denn hierdurch wird ein OnClick Ereignis ausgelöst.
procedure TForm1.CheckBox1Click(Sender: TObject);
var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True) then begin try if CheckBox1.Checked then begin Reg.WriteString('Security-Tool.exe', '"'+ParamStr(0)+'"'); end else begin Reg.DeleteValue('Security-Tool.exe'); end; finally Reg.CloseKey; end; end; finally FreeAndNil(Reg); end; end; |
hi ...
hmm ja danke erstmal ... habe jetzt leider keine Zeit. Werde das morgen mal überprüfen und schreiben ob es funktioniert. Vielen Dank :-D Trouble_Maker |
Noch eine Anmerkung, was Christian wohl übersehen hat:
In HKLM kann bei NT-basierenden Systemen nur der Admin schreiben. Desweiteren wäre dein Programm dann im Autostart von allen Bneutzer, ob sie wollen oder nicht. Besser in HLCU. Oder was ich noch besser fände, da transparenter für die Benutzer, die Autostartgruppe benutzen. |
Tachschen... so ich bins nochmal
hab jetzt den Code von Chrisitan Seehase ausprobiert. Der Compiler motzt nicht! Habe außerdem try und finally Blöcke eingebaut!!! Aber es funktioniert trotzdem nicht ... Das Progamm startet automatisch, und dann wird nichtmal in der Combobox der Haken angezeigt! Das kann doch nicht stimmen! Außerdem kann ich komischerweiße (mit meinem Code) das Programm nicht aus dem Autostart rausnehemen!!! kann mir jemand helfen ?!? danke Trouble_Maker |
Hallo,
ist jetzt vielleicht ein bisschen länger, tut aber was es soll. :D Vielleciht vom Code her etwas verständlicher, weil die langen Pfade nicht angegeben werden.
Delphi-Quellcode:
Der Aufruf bei einer CheckBox, oder einem MenüItem das geChecked ist, müsste dann so aussehen.
procedure SetAutoStart(AppTitle, AppName: string;
Register: Boolean; RunOnce: Boolean = False); var Registry: TRegistry; RegistryOpen: Boolean; begin RegistryOpen := False; Registry := TRegistry.Create; try Registry.RootKey := HKEY_CURRENT_USER; case RunOnce of True: begin RegistryOpen := Registry.OpenKey(REGSTR_PATH_RUNONCE, False); end; False: begin RegistryOpen := Registry.OpenKey(REGSTR_PATH_RUN, False) end; end; if RegistryOpen then begin if Register then begin try Registry.WriteString(AppTitle, AppName); except MessageBeep(MB_ICONASTERISK); ShowMessage('Der Autostartschlüssel konnte nicht in der ' + 'Registry angelegt werden !'); end; end else begin if Registry.ValueExists(AppTitle) then begin if not Registry.DeleteValue(AppTitle) then begin MessageBeep(MB_ICONASTERISK); ShowMessage('Der Autostartschlüssel konnte nicht aus der ' + 'Registry entfernt werden !'); end; end; end; Registry.CloseKey; end; finally Registry.Free; end; end;
Delphi-Quellcode:
Grüsse, Daniel :hi:
procedure TForm1.Autostart1Click(Sender: TObject);
begin if Autostart1.Checked then begin SetAutoStart('DBSysCon', ParamStr(0), False, False); AutoStart1.Checked := False; end else begin SetAutoStart('DBSysCon', ParamStr(0), True, False); AutoStart1.Checked := True; end; end; Nachtrag: AutoStart1 ist ein MenüPunkt mit Check-Möglichkeit. Also so ein Häckchen davor. Für ein ganz normales Menü. Oder auch PopUp-Menü. |
Hiho ...
@Daniel: Wieso findet er, wenn ich den Code von dir compiliere "REGSTR_PATH_RUNONCE" und "REGSTR_PATH_RUN" nicht ?!? muss ich irgendeine Komponente in die uses Liste noch mit aufnehmen ?!?!? danke Trouble_Maker |
Das sind wohl Konstanten für die Pfade, die er sich der Einfachheithalber deklariert hat.
|
Hallo,
@Luckie, Nein, keine Konstanten, sonst wär das ganze ja umsonst. ;) Wenn man trotzdem die langen Pfade angeben müsste. @Trouble, hast Du auch diese beiden Units eingebunden? Registry, RegStr. Grüsse, Daniel :hi: Nachtrag: Schau Dir mal die Unit RegStr an, da stehen so die wichtigsten Pfade drin. |
Man lernt nie aus. :shock:
|
Moin Daniel,
:thuimb: danke, die war mir bislang entgangen :? Was dabei aber auch nett ist: Es ist eine Übersetzung der RegStr.h, also eine offizielle Headerdatei von MS, und keine eigene "Welche Regkeys könnte man denn mal als Konstanten vordeklarieren" Lösung. |
Zitat:
Hiho Daniel, nein RegStr habe ich nicht mit eingebunden! Das war das Problem. Werde morgen mal schreiben, ob mein Code jetzt endlich funktioniert! Habe jetzt keine Lust meine Downloads auszumachen ^^ cu Trouble_Maker |
Hi ... ich bins mal wieder :-(
ich verstehs einfach nicht. Das Prog (der Autostart) funktiniert einfach nicht ... Kann es sein, dass es damit zusammengängt, dass diese CheckBox erst "enabled" wird, wenn man das richtige Passwort in ein anderes Edit reingeschrieben hat ?!? Das mache ich, weil ich nicht möchte, dass jemand unbefugtes einfach wichtige Einstellungen ohne Passwort einstellen darf ... ?!? *verzweifeltguck* Trouble_Maker |
Hallo,
also meine Prozedur funktioniert wunderbar in vielen Programmen, häng doch einfach Dein ganzes Projekt dran, vielleciht erbermt sich einer und schaut sich das mal genauer an. Den so kommen wir anscheinend auch nicht weiter. Grüsse, Daniel :hi: |
Liste der Anhänge anzeigen (Anzahl: 1)
Hiho
so ich bins nochmal ... Weil das ja alles nich gescheit bei mir funktioniert mit dem Autostart, habe ich jetzt mal meine kompletten Sources als Attachment hinzugefügt !!! - Wäre wirklich nett von jemanden von euch, wenn er mein Problem mit dem Autostart lösen könnte... Danke schonmal im Vorraus Trouble_Maker |
Wenn es schnell gehen soll, könntest du aber auch eine Komponente nutzten, dann würde ich dir die von Utilmind empfehlen:
![]() AutoRunner heißt die, glaube ich |
Moin Trouble Maker,
ich hatte Dir schon mal ziemlich zu Anfang des Threads den Tip gegeben, den Pfad der Anwendung in " einzuschliessen. Sähe dann so aus:
Delphi-Quellcode:
Da die Funktion, mit der in den Autostart eingetragen werden soll ansonsten gut aussieht, wäre es mal ganz interessant, zu sehen, was denn in dem Key steht.
Reg.WriteString(AppTitle,'"'+AppName+'"');
|
Hiho
hmm ... @UncleCracker: eigentlich wollte ich keine Komponente benutzen! Muss ja auch so gehen ... @Christian Seehase: Hä ... weiss jetzt nicht so richtig was du damit meinst !!! kannst du mir das nochmal erklären ? Wäre echt nett. Will das jetzt endlich hinbekommen mit dem sch*** Autostart ^^ cu Trouble_Maker |
Moin Trouble Maker,
da die Funktion ansonsten gut aussieht, also so funktionieren müsste, kann das Problem eigentlich nur noch darin liegen, dass Windows die zu startende Datei nicht findet. Wenn der Pfad ein Leerzeichen enthält und nicht in " eingeschlossen wird, nimmt das System als Pfad für das zu startende Programm nur den Pfad bis zum Leerzeichen und ignoriert den Rest. Und deshalb solltest Du es mal statt mit
Delphi-Quellcode:
mit
Reg.WriteString(AppTitle,AppName);
Code:
versuchen.
Reg.WriteString(AppTitle,[color=red]'"'+[/color]AppName[color=red]+'"'[/color]);
|
Hiho
ah cool danke (@Christian) Werde es morgen mal ausprobieren, da ich jetzt noch was für die Schule machen muss :-( also bis dann Trouble_Maker |
Hiho :-(
Christan Seehase, kannst du mir verraten, wieso der Compiler rummeckert, wenn ich den von dir stammenden Code verändere ?!? Er meint: Zu viele Parameter !!! Habe auch mal versucht mal ein ' oder " zu entfernen dann meint er aber nicht geschlossener String. Kannst du mir helfen ? Ich bin wirklich am verzweifeln. :-| Danke Trouble_Maker |
Hallo Trouble_Maker,
bin gerade über deinen Quelltext geflogen *haberichtigangstbekommen*. Deinen Schlüssel mit dem Datenwert 'Autostart' wirst Du nie schreiben, da Du ihn abhängig von "CheckBox1.checked" machst. Dieser wird aber in "TForm1.FormCreate" nur gesetzt, wenn es ihn gibt. Der Amerikaner sagt, glaube ich, Catch 22 dazu. Du drehst dich im Keis. Du solltest besser prüfen, ob der Autostart Schlüssel unter 'Software\Microsoft\Windows\CurrentVersion\Run' existert und dann deine Hacken setzen. Dann würdest Du auch bei Programmstart (von Hand) mitbekommen, daß Dir einer den Schlüssel gekegelt hat. bye [Nachtrag] so würde es auch gehen[/Nachtrag]
Delphi-Quellcode:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin if CheckBox1.Checked then begin SetAutoStart('DBSysCon', ParamStr(0), False, False); CheckBox1.Checked := False; reg.WriteInteger('Autostart', 1); // mit öffnen und schließen versteht sich else begin SetAutoStart('DBSysCon', ParamStr(0), True, False); CheckBox1.Checked := True; Reg.DeleteValue('Autostart'); // mit öffnen und schließen versteht sich end; end; |
Hi!!
Hab mir deinen Ursprünglichen Quellcode jetzt mal in mein Delphi kopiert, und das 2. false (if CheckBox1.checked = false then) in true umgeändert (hinweis gabs eh schon)...bei mir funzt das alles irgendwie einwandfrei!! (Allerdings habe ich auch keine Leerzeichen in meinen Verzeichnissen) Vielleicht liegt es ja doch an einem Rechteproblem bei dir?? MfG Steran |
Hiho ...
erstmal vielen Dank für eure Hilfe und Mühe, die ihr für mich aufbringt. Werde es später mal testen. (@Duffy) An meinen Rechteprobelemen kann das aber nicht liegen, weil ich Win98 SE habe ^^ (bin übrigens mehr als zufrieden *g*) bis dann Trouble_Maker |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 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-2025 by Thomas Breitkreuz