AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Autostart: Wieso funktioniert der Code nicht ?!?
Thema durchsuchen
Ansicht
Themen-Optionen

Autostart: Wieso funktioniert der Code nicht ?!?

Ein Thema von Trouble_Maker · begonnen am 24. Jun 2003 · letzter Beitrag vom 3. Jul 2003
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Trouble_Maker
Trouble_Maker

Registriert seit: 30. Jan 2003
244 Beiträge
 
Delphi 6 Personal
 
#1

Autostart: Wieso funktioniert der Code nicht ?!?

  Alt 24. Jun 2003, 13:01
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
  Mit Zitat antworten Zitat
Benutzerbild von Uncle Cracker
Uncle Cracker

Registriert seit: 30. Mär 2003
Ort: Freital
694 Beiträge
 
#2
  Alt 24. Jun 2003, 13:07
Liegt der Fehler daran das du 2x
Code:
CheckBox1.checked = true then
im letzten Code-Abschnitt geschrieben hast?
I wish it was legal to marry software because I'm madly in love with Delphi...
  Mit Zitat antworten Zitat
Benutzerbild von Trouble_Maker
Trouble_Maker

Registriert seit: 30. Jan 2003
244 Beiträge
 
Delphi 6 Personal
 
#3
  Alt 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
  Mit Zitat antworten Zitat
Benutzerbild von Trouble_Maker
Trouble_Maker

Registriert seit: 30. Jan 2003
244 Beiträge
 
Delphi 6 Personal
 
#4
  Alt 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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Trouble_Maker
Trouble_Maker

Registriert seit: 30. Jan 2003
244 Beiträge
 
Delphi 6 Personal
 
#6
  Alt 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


Trouble_Maker
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7
  Alt 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Trouble_Maker
Trouble_Maker

Registriert seit: 30. Jan 2003
244 Beiträge
 
Delphi 6 Personal
 
#8
  Alt 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
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#9
  Alt 25. Jun 2003, 17:44
Hallo,

ist jetzt vielleicht ein bisschen länger, tut aber was es soll.
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

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ü.
  Mit Zitat antworten Zitat
Benutzerbild von Trouble_Maker
Trouble_Maker

Registriert seit: 30. Jan 2003
244 Beiträge
 
Delphi 6 Personal
 
#10
  Alt 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 Uhr.
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