Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Programm im Autostart


Robii - So 21.06.09 16:00
Titel: Programm im Autostart
Guten Mittag,
wollte fragen, wie ich mein Programm im Autostart verankern kann, so das es von alleine startet, wenn man den Pc einschaltet. Habe bei Google.de gelsen, das ich es in folgenden Ordner
Zitat:
C:\Users\*****\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

kopieren muss. Allerdings ist der Benuztername ja auf jedem Computer anders und nicht jeder Computer
hat Windows Vista, wodurch sich der Pfad ja auch vom Betriebssystem abhänig ändert.
Gruß.


Xentar - So 21.06.09 16:07

Ist zwar nicht der Ordner Autostart, sondern die Registry, aber vielleicht hilft dir das schon.
http://www.delphi-treff.de/tipps/applikation/wiki/Programme%20in%20den%20Autostart%20schreiben/


Robii - So 21.06.09 16:21

[Verständnisfrage]

Zitat:

Folgen der Aufruf führt das eigene Programm beim nächsten Hochfahren von Windows aus, sofern sich der gleiche Benutzer anmeldet.

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateAutorunEntry(Application.Title, ParamStr(0), akUserRunOnce);
end;



Heißt das, wenn ich diesen Code bei der Installation aufrufe wird mein Programm beim nächsten WindowsStart in automatisch gestartet oder muss ich bei jedem WindowsStart den Code aufrufen, um das Programm zu starten ? Wobei letztere Möglichkeit für mich sehr sinnlos erscheint.

Gruß


Xentar - So 21.06.09 16:32

Mit dem Code wie er da steht, wird das Programm nur einmal beim nächsten Neustart ausgeführt, danach nicht mehr.
Woran das liegt, und wie man es ändert, darfst du nun selber rausfinden - ist ja nur eine Zeile ;)


Robii - So 21.06.09 16:47


Delphi-Quelltext
1:
2:
3:
4:
5:
CreateAutorunEntry(Application.Title, ParamStr(0), akUserRunOnce);

Ersetzt durch :

CreateAutorunEntry(Application.Title, ParamStr(0), akUserRun);


Dann müsste es so klappen, oder? :)
Gruß


Popov - So 21.06.09 16:55

Also die Prozedur verankert das Programm in der Registry. Er fragte nach Autostart im Startmenü.

Hier eine Funktion für Verknüpfungen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure CreateShortCut(ShortCut, Application, Parameters, WorkDir: String;
  SW_State: Integer; IconFile: String; IconIndex: Byte);
var
  SCObject: IUnknown;
  SCSLink: IShellLink;
  SCPFile: IPersistFile;
  WFName: WideString;
begin
  SCObject := CreateComObject(CLSID_ShellLink);
  SCSLink := SCObject as IShellLink;
  SCPFile := SCObject as IPersistFile;
  SCSLink.SetPath(PChar(Application));
  SCSLink.SetArguments(PChar(Parameters));
  SCSLink.SetWorkingDirectory(PChar(WorkDir));
  SCSLink.SetShowCmd(SW_State);
  SCSLink.SetIconLocation(PChar(IconFile), IconIndex);
  WFName := ShortCut;
  SCPFile.Save(PWChar(WFName), False);
end;


Dabei müßten
ShortCut der Ort der Verknüpfung sein, also z.B. der Autostartordner
Application der Programmpfad der Anwendung
Parameters die Parameter der Anwendung
WorkDir der Arbeitsordner der Anwendung
SW_State die Art der Ausführung, z.B. SW_NORMAL
IconFile der IconPfad (kann auch eine Exe sein)
IconIndex die Nummer des Icons (0 für ersten)

Jetzt mußt du nur noch eine Funktion für virtuelle Verzeichnisse für den ShortCut Parameter finden. Davon gibt es im Forum aber jede Menge.


Andreas L. - So 21.06.09 17:01

user profile iconPopov hat folgendes geschrieben Zum zitierten Posting springen:

Jetzt mußt du nur noch eine Funktion für virtuelle Verzeichnisse...


Das geht so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
function GetShellFolder(CSIDL: integer): string;
var
  pidl                   : PItemIdList;
  FolderPath             : string;
  SystemFolder           : Integer;
  Malloc                 : IMalloc;
begin
  Malloc := nil;
  FolderPath := '';
  SHGetMalloc(Malloc);
  if Malloc = nil then
  begin
    Result := FolderPath;
    Exit;
  end;
  try
    SystemFolder := CSIDL;
    if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then
    begin
      SetLength(FolderPath, max_path);
      if SHGetPathFromIDList(pidl, PChar(FolderPath)) then
      begin
        SetLength(FolderPath, length(PChar(FolderPath)));
      end;
    end;
    Result := FolderPath;
  finally
    Malloc.Free(pidl);
  end;
end;

Quelle: http://www.michael-puff.de/Artikel/HOMEDIR.shtml


Delphi-Quelltext
1:
  CreateShortcut(IncludeTrailingPathDelimiter(GetShellFolder(CSIDL_APPDATA)) + 'Microsoft\Windows\Start Menu\Programs\Startup\namederverknüpfung.lnk', Application.ExeName, '''', SW_NORMAL, Application.Exename, 0);                    


Robii - So 21.06.09 17:38

Jetzt habt ihr mich alle verwirrt.
Ich dachte, dass ich mit dieser Funktion

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
uses
Registry;

function CreateAutorunEntry(const AName, AFilename: stringconst AKind: TAutorunKind): Boolean;
var
Reg: TRegistry;
begin
Result:=False;
Reg := TRegistry.create;
try
   if (AKind=akUserRun) or (AKind=akUserRunOnce) then
     Reg.Rootkey:= HKEY_CURRENT_USER
   else
     Reg.RootKey := HKEY_LOCAL_MACHINE;

   case AKind of
     akRun, akUserRun        : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
     akRunOnce, akUserRunOnce: Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True);
     akRunServices           : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServices', True);
     akRunServicesOnce       : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServicesOnce', True);
   end;
   Reg.WriteString(AName, AFilename);
finally
   Reg.Free;
end;
end;


Und diesem Aufruf:

Delphi-Quelltext
1:
2:
3:
begin
CreateAutorunEntry(Application.Title, ParamStr(0), akUserRunOnce);
end;


In meiner Anwendung, diese in den Autostart legen kann, so das sie jedesmal, wenn der Computer gestartet
wird aufgerufen wird.

End.


Popov - So 21.06.09 17:55

Es gibt einige Autostarts unter Windows. So gibt es den Run-Ordner in der Registry und den Autostart-Ordner in deinem Startmenü. Welchen du benutzt ist deine Sache, aber der Autostart-Ordner ist für den Nutzer einfacher. Wenn er nicht will, daß ein Programm bei Start ausgeführt wird, kann er die Verknüpfung leichter löschen. Bei Run in der Registry muß sich der Nutzer etwas genauer mit dem System auskennen.


Robii - So 21.06.09 18:17

Ok, viel interessanter ist aber, ob das was ich da gepostet habe, so funktioniert? :)
Gruß


Xentar - So 21.06.09 18:24

Spricht was dagegen, es einfach auszuprobieren?
Wenn du nur den Rechner nicht neu starten möchtest: Schau halt in der Registry (Start -> Ausführen -> regedit) nach, ob der Eintrag erstellt wird.


Robii - So 21.06.09 19:15

Kann mir jemand die Funktion, die ich oben gepostet hatte, evtl. nocheinmal Schritt für Schritt erklären?
Verstehe diese nicht richtig, hoffe, das wenn ich sie verstehe, schlauer werde. Was ist denn, wenn ich in
meinem Programm P1 das Programm P2 in den Autostart einbinden möchte, bzw wie müsste der Aufruf dann aussehen?


Delphi-Quelltext
1:
CreateAutorunEntry(Application.Title, ParamStr(0), akUserRunOnce);                    


End.


Andreas L. - So 21.06.09 19:23

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Was ist denn, wenn ich in
meinem Programm P1 das Programm P2 in den Autostart einbinden möchte, bzw wie müsste der Aufruf dann aussehen?


P2 ist das Programm das automatisch gestartet werden soll?


Delphi-Quelltext
1:
CreateAutorunEntry('Name von P2''C:\Programme\P2.exe', akUserRun);                    


War das jetzt so schwer?


Robii - So 21.06.09 19:27

Nein ;) Du hattest mich falschverstanden.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
uses
Registry;

function CreateAutorunEntry(const AName, AFilename: stringconst AKind: TAutorunKind): Boolean;
var
Reg: TRegistry;
begin
Result:=False;
Reg := TRegistry.create;
try
   if (AKind=akUserRun) or (AKind=akUserRunOnce) then
     Reg.Rootkey:= HKEY_CURRENT_USER
   else
     Reg.RootKey := HKEY_LOCAL_MACHINE;

   case AKind of
     akRun, akUserRun        : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
     akRunOnce, akUserRunOnce: Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True);
     akRunServices           : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServices', True);
     akRunServicesOnce       : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServicesOnce', True);
   end;
   Reg.WriteString(AName, AFilename);
finally
   Reg.Free;
end;
end;


Diese Funktion wollte ich erklärt haben, da ich diese nicht verstehe. Also die Vorgehensweise.

Gruß


Andreas L. - So 21.06.09 19:33


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
uses
  Registry;

function CreateAutorunEntry(const AName, AFilename: stringconst AKind: TAutorunKind): Boolean;
var
Reg: TRegistry;
begin
Result:=False;
Reg := TRegistry.create; //Komponente für den Zugriff auf die Registry initalisieren
try
  //RootKey anhand des Parameter AKind auswählen und setzen
   if (AKind=akUserRun) or (AKind=akUserRunOnce) then
     Reg.Rootkey:= HKEY_CURRENT_USER
   else
     Reg.RootKey := HKEY_LOCAL_MACHINE;

  //Schlüssel wählen in dem der Eintrag erstellt werden soll
   case AKind of
     akRun, akUserRun        : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); //Ganz normaler autostart
     akRunOnce, akUserRunOnce: Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True); //Programm startet nur einmal
     akRunServices           : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServices', True); //Normaler Autostart für Dienste
     akRunServicesOnce       : Result:=Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServicesOnce', True); //Dienst nur einmal starten
   end;
   Reg.WriteString(AName, AFilename); //Eintrag erstellen
finally
   Reg.Free; //Speicher freigeben
end;
end;

Weißt du jetzt wie die Routine funktioniert? Falls nicht solltest du 1. mal regedit starten und dich ein bisschen in Registry umschauen damit du weißt wie das Teil funkioniert und 2. ein Delphi-Registry-Tutorial lesen (Forumsuche benutzen)


Robii - So 21.06.09 19:39

Danke, das hat mir sehr geholfen. Eine Frage ist dabei jedoch aufgekommen, wo ist der Unterschied zwischen
Einem ganz Normalen Autostart und einem Normalen Autostart für einen Dienst, bzw was ist ein Dienst ?
Gruß


Andreas L. - So 21.06.09 19:41

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Danke, das hat mir sehr geholfen. Eine Frage ist dabei jedoch aufgekommen, wo ist der Unterschied zwischen
Einem ganz Normalen Autostart und einem Normalen Autostart für einen Dienst, bzw was ist ein Dienst ?
Gruß


http://de.wikipedia.org/wiki/Windows-Systemdienst


Robii - So 21.06.09 19:45

Danke. Hab es jetzt verstanden :)