Delphi-PRAXiS
Seite 1 von 3  1 23      

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 13: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 13:07

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

Trouble_Maker 24. Jun 2003 13: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 15: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 15: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 17: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 17: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 17: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 17: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 13: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


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz