Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Autostart: Wieso funktioniert der Code nicht ?!? (https://www.delphipraxis.net/5940-autostart-wieso-funktioniert-der-code-nicht.html)

Trouble_Maker 24. Jun 2003 14:01


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:
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;
so ... also
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

Uncle Cracker 24. Jun 2003 14:07

Liegt der Fehler daran das du 2x
Code:
CheckBox1.checked = true then
im letzten Code-Abschnitt geschrieben hast?

Trouble_Maker 24. Jun 2003 14:23

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

Trouble_Maker 24. Jun 2003 16:20

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

Christian Seehase 24. Jun 2003 16:26

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:
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;
Aufpassen solltest Du noch beim Zuweisen eines Wertes an CheckBox.Checked, denn hierdurch wird ein OnClick Ereignis ausgelöst.

Trouble_Maker 24. Jun 2003 18:23

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

Luckie 24. Jun 2003 18:30

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.

Trouble_Maker 25. Jun 2003 18:30

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

Daniel B 25. Jun 2003 18:44

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:
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;
Der Aufruf bei einer CheckBox, oder einem MenüItem das geChecked ist, müsste dann so aussehen.
Delphi-Quellcode:
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;
Grüsse, Daniel :hi:

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ü.

Trouble_Maker 26. Jun 2003 14:44

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

Luckie 26. Jun 2003 17:52

Das sind wohl Konstanten für die Pfade, die er sich der Einfachheithalber deklariert hat.

Daniel B 26. Jun 2003 22:45

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.

Luckie 27. Jun 2003 02:07

Man lernt nie aus. :shock:

Christian Seehase 27. Jun 2003 10:46

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.

Trouble_Maker 27. Jun 2003 22:01

Zitat:

Zitat von Daniel B
@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.


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

Trouble_Maker 29. Jun 2003 17:10

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

Daniel B 29. Jun 2003 17:16

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:

Trouble_Maker 30. Jun 2003 13:28

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

Uncle Cracker 30. Jun 2003 14:50

Wenn es schnell gehen soll, könntest du aber auch eine Komponente nutzten, dann würde ich dir die von Utilmind empfehlen: www.utilmind.com

AutoRunner heißt die, glaube ich

Christian Seehase 30. Jun 2003 17:42

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:
          Reg.WriteString(AppTitle,'"'+AppName+'"');
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.

Trouble_Maker 1. Jul 2003 19:52

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

Christian Seehase 1. Jul 2003 20:41

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:
Reg.WriteString(AppTitle,AppName);
mit

Code:
Reg.WriteString(AppTitle,[color=red]'"'+[/color]AppName[color=red]+'"'[/color]);
versuchen.

Trouble_Maker 1. Jul 2003 20:53

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

Trouble_Maker 2. Jul 2003 20:23

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

Duffy 2. Jul 2003 23:03

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;

Steran 3. Jul 2003 12:34

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

Trouble_Maker 3. Jul 2003 14:41

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