Autor Beitrag
Robii
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: So 21.06.09 16:00 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: So 21.06.09 16:07 
Ist zwar nicht der Ordner Autostart, sondern die Registry, aber vielleicht hilft dir das schon.
www.delphi-treff.de/...tostart%20schreiben/

_________________
PROGRAMMER: A device for converting coffee into software.
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 ;)

_________________
PROGRAMMER: A device for converting coffee into software.
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: So 21.06.09 16:47 
ausblenden 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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:

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

_________________
Popov
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: 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:
ausblenden 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: www.michael-puff.de/Artikel/HOMEDIR.shtml

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: So 21.06.09 17:38 
Jetzt habt ihr mich alle verwirrt.
Ich dachte, dass ich mit dieser Funktion
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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.

_________________
Popov
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: So 21.06.09 18:17 
Ok, viel interessanter ist aber, ob das was ich da gepostet habe, so funktioniert? :)
Gruß
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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.

_________________
PROGRAMMER: A device for converting coffee into software.
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: 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?

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


End.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: 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?

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


War das jetzt so schwer?
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: So 21.06.09 19:27 
Nein ;) Du hattest mich falschverstanden.

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: So 21.06.09 19:33 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: 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ß


de.wikipedia.org/wiki/Windows-Systemdienst
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: So 21.06.09 19:45 
Danke. Hab es jetzt verstanden :)