Autor Beitrag
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: Mo 19.05.03 13:41 
Passend zu Tino's und Mathias's Beiträgen zum Autostart und virtuellen Ordnern.

Diesen Code kann man nutzen um im Autostart-Ordner eine Verknüpfung für ein Programm zu erstellen. Mit einer anderen ID kann man auch in jedem anderen virtuellen Ordner eine Verknüpfung erstellen, z.B. im Ordner "Senden an". Man braucht nur eine passende CSIDL-Konstante.

Da ich den Code öfters benötige, hab ich es in eine Unit gepackt:

ausblenden volle Höhe 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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
unit uLinkFile;

interface

  function LinkFileExists(ID: Integer; var LinkPath: String): Boolean;
  function LinkFile(ID: Integer; Link: Boolean; Param: String): Boolean;

implementation

uses
  Windows, ComObj, ActiveX, SysUtils, Shlobj;

{ID's (kleine Auswahl) 
  CSIDL_STARTUP = Autostart
  CSIDL_DESKTOP = Desktop
  CSIDL_SENDTO = Senden an
  CSIDL_STARTMENU = Startmenü
  CSIDL_PROGRAM_FILES = Programme
  ...
}


  {Liefert den Pfad eines virtuellen Ordners}
function SpecialDirectory(ID: Integer): String;
var
  pidl : PItemIDList;
  Path : PChar;
begin
  if SUCCEEDED(SHGetSpecialFolderLocation(0, ID, pidl)) then begin
    Path := StrAlloc(max_path);
    SHGetPathFromIDList(pidl, Path);
    Result := String(Path);
    if Result[Length(Result)] <> '\' then Result := Result + '\';
  end else Result := '';
end;

  {Erstellt eine Verknüpfung in einem Ordner - LANG}
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;
  with SCSLink do begin
    SetPath(PChar(Application));
    SetArguments(PChar(Parameters));
    SetWorkingDirectory(PChar(WorkDir));
    SetShowCmd(SW_State);
    SetIconLocation(PChar(IconFile), IconIndex);
  end;
  WFName := ShortCut;
  SCPFile.Save(PWChar(WFName), False);
end;

  {Prüft ob Link bereits vorhanden}
function LinkFileExists(ID: Integer; var LinkPath: String): Boolean;
begin
  LinkPath := SpecialDirectory(ID) +
    ExtractFileName(ChangeFileExt(ParamStr(0), '.lnk'));
  Result := FileExists( LinkPath );
end;

  {Erstellt eine Verknüpfung in einem Ordner - KURZ}
function LinkFile(ID: Integer; Link: Boolean; Param: String): Boolean;
var
  LinkPath: String;
begin
  Result := LinkFileExists(ID, LinkPath);
  if Link then begin if not FileExists(LinkPath) then
    CreateShortCut(LinkPath, ParamStr(0), Param, ExtractFilePath(ParamStr(0)),
      SW_SHOWNORMAL, ParamStr(0), 0);
  end else DeleteFile(LinkPath);
end;


Um eine Verknüpfung zu erstellen (oder zu entfernen) braucht man eigentlich nur die LinkFile Funktion. Allerdings sollte man immer wissen ob in dem Ordner bereits eine Verknüpfung existiert. Dazu kann man die Funktion LinkFileExists nutzen.

Hier ein Beispiel. Per Checkbox-Eintrag wird festgelegt, ob eine Verknüpfung erstellt oder entfernt wird. Beim Start des Programms wird überprüft ob ein Link bereits vorhanden ist und es wird die Checkbox mit dem passendem Wert gesetzt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
uses Shlobj {Shlobj für die Konstanten};

  {CheckBox setzten}
procedure TForm1.FormCreate(Sender: TObject);
var
  Dummy: String;
begin
  CheckBox_Autostart.Checked := LinkFileExists(CSIDL_STARTUP, Dummy);
end;

  {Verknüpfung erstellen oder löschen (abhängig von CheckBox)}
procedure TForm1.CheckBox_AutostartClick(Sender: TObject);
begin
  LinkFile(CSIDL_STARTUP, CheckBox_Autostart.Checked, '-parameter');
end;


Zwei Funktionen der Unit sind aus dem Internet. Allerdings weiß ich nicht wem die Ehre gebührt.

_________________
Popov