AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Autostart

Ein Thema von DelphiUser123 · begonnen am 9. Okt 2015 · letzter Beitrag vom 9. Okt 2015
Antwort Antwort
DelphiUser123

Registriert seit: 23. Feb 2013
23 Beiträge
 
#1

Autostart

  Alt 9. Okt 2015, 11:42
Liebe Delphi Freunde,

ich möchte eine Verknüpfung meines Programmes in den Autostart Ordner verschieben.
Und zwar automatisch und für beliebige Rechner und nicht manuell.

Dazu benötige ich den Pfad für Autostart (der bei jedem Rechner anders sein kann).
Meine Recherchen ergaben: SHGetKnownFolderPath muss ich benutzen und in Uses Shlobj hinzufügen.
Microsoft sagt:
Code:
HRESULT SHGetKnownFolderPath(
  _In_     REFKNOWNFOLDERID rfid,
  _In_     DWORD           dwFlags,
  _In_opt_ HANDLE          hToken,
  _Out_    PWSTR           *ppszPath
);
Nun schreibe ich in das erste Argument FOLDERID_Startup, jedoch meldet Delphi zu eben diesem: "undeklarierter Bezeichner". Fehlt in Uses noch etwas das ich einbinden muss oder was mache ich falsch?

Vielen Dank für Antworten.
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Autostart

  Alt 9. Okt 2015, 11:54
Hallo,

hier findest du die Deklarationen: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Autostart

  Alt 9. Okt 2015, 12:17
Unter Delphi 7 komme ich so an den Autostartordner:
Delphi-Quellcode:
uses ShlObj;

...
var
  PIDL : PItemIDList;
  InFolder : array[0..MAX_PATH] of Char;
begin
  SHGetSpecialFolderLocation(0, CSIDL_STARTMENU, PIDL);
  SHGetPathFromIDList(PIDL, InFolder);
  fStartMenu := inFolder;
  SHGetSpecialFolderLocation(0, CSIDL_APPDATA, PIDL);
  SHGetPathFromIDList(PIDL, InFolder);
  fLocalAppData := inFolder;
  SHGetSpecialFolderLocation(0, CSIDL_STARTUP, PIDL);
  SHGetPathFromIDList(PIDL, InFolder);
  fAutoStartMenu := inFolder;
end;

...
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Autostart

  Alt 9. Okt 2015, 13:07
@nahpets Hat das einen besonderen Grund, warum du über die PItemIDList gehst?

Das ginge doch auch kürzer:

Delphi-Quellcode:
function MySHGetFolderPath(const CLSID: Cardinal): string;
var
  Puffer : array[0..MAX_PATH] of Char;
begin
  SHGetFolderPath(0, // Handle
                  CLSID,
                  0, // hToken
                  0, // dwFlags
                  puffer);
  Result := string(Puffer);
end;
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: Autostart

  Alt 9. Okt 2015, 13:21
@nahpets Hat das einen besonderen Grund, warum du über die PItemIDList gehst?
Nö, eigentlich nicht, das ist mal wieder so ein klassischer Fall von "Vererbung per Copy&Paste"
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#6

AW: Autostart

  Alt 9. Okt 2015, 17:45
Ein kleiner Hinweis

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Deshalb in neuen Progs

SHGetKnownFolderPath

statt

SHGetFolderPath

verwenden..
  Mit Zitat antworten Zitat
DelphiUser123

Registriert seit: 23. Feb 2013
23 Beiträge
 
#7

AW: Autostart

  Alt 9. Okt 2015, 18:11
HolgerX war auf derselben Webseite wie ich.
Die Funktion von mm1256 funktioniert zwar bei mir, Danke.
Aber ich hätte gerne ein modernes neues Programm, wobei ich wieder am Anfangsproblem wäre.

Geändert von DelphiUser123 ( 9. Okt 2015 um 18:13 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#8

AW: Autostart

  Alt 9. Okt 2015, 19:13
Einfach selber definieren.

Delphi-Quellcode:
const
  FOLDERID_Startup : TGUID = '{B97D20BB-F46A-4C97-BA10-5E3608430854}';

weitere GUIDs findest Du im Link von mm1256

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Delphi kennt die Konstanten noch nicht, sind ja erst seit Windows Vista vorhanden

Deshalb auch am besten auch dynamisch linken:

Delphi-Quellcode:
const
  SHELL32_DLL : String = 'SHELL32.DLL';

// Systemordner ab Vista ermitteln
// DYNAMISCHER FUNKTIONSIMPORT !!!
type
  TShGetKnownFolderPath = function(const rfid : TGUID;
                                   dwFlags : DWord;
                                   hToken : THandle;
                                   out ppszPath : PWideChar): HResult; stdcall;

{*** Systemordner ab Vista ermitteln ***}
function ShGetKnownFolderPath(const rfid: TGUID;
                              dwFlags: DWord;
                              hToken: THandle;
                              out ppszPath: PWideChar): HResult;
var
  DLL_Handle : THandle;
  DLL_ShGetKnownFolderPath : TShGetKnownFolderPath;
begin
  Result := 0;
  // Handle für die SHELL32.DLL erhalten
  DLL_Handle := LoadLibrary(PChar(SHELL32_DLL));
  // Wenn Handle vorhanden, Adressen der Funktionen ermitteln
  if DLL_Handle <> 0 then begin
    try
      // Adressen ermitteln
      @DLL_ShGetKnownFolderPath := GetProcAddress(DLL_Handle, 'SHGetKnownFolderPath');
      // Wurde SHGetKnownFolderPath in der DLL gefunden?
      if @DLL_ShGetKnownFolderPath <> nil then begin
        Result:= DLL_ShGetKnownFolderPath(rfid, dwFlags, hToken, ppszPath);
      end else begin
        RaiseLastOSError;
      end;
    finally
      FreeLibrary(DLL_Handle);
    end;
  end else begin
    RaiseLastOSError;
  end;
end;
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

AW: Autostart

  Alt 9. Okt 2015, 19:22
Hallo,

ich hab mir mal die Arbeit gemacht, und alle KNOWNFOLDERID's zusammengefasst. Jetzt weiß ich ja, wofür es nützlich war

Anbei die .pas.
Angehängte Dateien
Dateityp: pas RuWindowsFolderID.pas (46,9 KB, 10x aufgerufen)
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

AW: Autostart

  Alt 9. Okt 2015, 19:26
AUTOSTART geht auch anders - über die Registry:

Delphi-Quellcode:
uses
Registry;

function CreateAutorunEntry(const AName, AFilename: String; active: Boolean): Boolean;
var
 Reg: TRegistry;
begin
 Reg := TRegistry.create;
 try
     Reg.Rootkey:= HKEY_CURRENT_USER;
     Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
     if active = true then
     Reg.WriteString(AName, AFilename)
     else
     Reg.DeleteValue(AName);
 finally
   Reg.Free;
   Result := true;
 end;
end;

Aufruf:
procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateAutorunEntry(Application.Title, ParamStr(0), TRUE);
end;
Test-Programm

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Win.Registry, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    CheckBox1: TCheckBox;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CreateAutorunEntry(const AName, AFilename: String; active: Boolean): Boolean;
var
 Reg: TRegistry;
begin
 Reg := TRegistry.create;
 try
     Reg.Rootkey:= HKEY_CURRENT_USER;
     Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
     if active = true then
     Reg.WriteString(AName, AFilename)
     else
     Reg.DeleteValue(AName);
 finally
   Reg.Free;
   Result := true;
 end;
end;

// [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
function IsAutoRun : Boolean;
var Reg : TRegistry;
begin
 Reg := TRegistry.create;
 try
     Reg.Rootkey:= HKEY_CURRENT_USER;
     Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
// Form1.CheckBox1.Checked :=
     Result:= Reg.ValueExists(Application.Title);
 finally
   Reg.Free;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateAutorunEntry(Application.Title, ParamStr(0), TRUE);
   Sleep(1000); Winapi.Windows.Beep(1000,100); Winapi.Windows.Beep(2000,100);
   CheckBox1.Checked:= IsAutoRun;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  CheckBox1.Checked:= IsAutoRun;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   CreateAutorunEntry(Application.Title, ParamStr(0), FALSE);
   Sleep(1000); Winapi.Windows.Beep(2000,100); Winapi.Windows.Beep(1000,100);
   CheckBox1.Checked:= IsAutoRun;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Caption:= Application.Title;
  CheckBox1.Checked:= IsAutoRun;
end;

end.
Miniaturansicht angehängter Grafiken
autoruntest.jpg  
Angehängte Dateien
Dateityp: zip AutoRunTest.zip (649,4 KB, 15x aufgerufen)

Geändert von hathor ( 9. Okt 2015 um 20:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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