Filelink/de

From Free Pascal wiki
Jump to navigationJump to search
Windows logo - 2012.svg

Dieser Artikel behandelt ausschließlich Windows.

Siehe auch: Multiplatform Programming Guide/de

Deutsch (de) English (en)

Zurück zu den Zusätzlichen Informationen.

Dieses Tutorial handelt von der Windowsprogrammierung.
Dieses Tutorial zeigt, wie man unter Windows einen Dateilink erstellt.

Folgende Units werden dafür benötigt:

uses
  Registry, ActiveX, ComObj, ShlObj, SysUtils;


Um der Funktion mitzuteilen, wo der Link gespeichert werden soll wird eine Aufzählung verwendet.
Diese Aufzählung muss je nachdem wo die Funktion aufgerufen wird entweder im interface oder im implementation Abschnitt der Unit deklariert werden.
Definition der Aufzählung:

type
  ShortcutType = (_DESKTOP, _QUICKLAUNCH, _SENDTO, _STARTMENU, _OTHERFOLDER);


Die Funktion für das Erstellen eines Links (Dateilinks) sieht wie folgt aus:

// Diese Funktion arbeitet mit den Daten des aktuellen Users
function funErstelleLink(                   // Funktionsname
  const strQuelldatei: string;              // Pfad und Name der Originaldatei
  const enuSpeicherort: ShortcutType;       // Wo soll der Shortcut gespeichert werden
  const strUnterverzeichnis: string = '';   // Optional: Alternativer Pfad zum
                                            //     speichern des Links
  const strArbeitsverzeichnis: string = ''; // Optional: Pfad oder Verzeichnis in dem
                                            //     das Programm arbeiten soll
  const strParameter: string = '';          // Optional: Übergabeparameter an das Programm
  const strBeschreibung: string = '';       // Optional: Beschreibung des Shortcuts
  const strIconDatei: string = '';          // Optional: Datei, die das Icon enthält
  const intIconNummer: integer = 0          // Optional: Das wievielte Icon das aus
                                            //     der Icondatei genommen werden soll
                                            //     (Die Zählung der Icons begint bei 1)
  ): string;                                                                           

const
  SHELL_FOLDERS_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\Explorer';
  QUICK_LAUNCH_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\GrpConv';

var
  MyObject: IUnknown;
  MySLink: IShellLink;
  MyPFile: IPersistFile;
  Reg: TRegIniFile;
  strVerzeichnis: string = '';
  strLinkName: string = '';
  wstrDateiname: WideString = '';

begin

  Result := '';

  // Erstellt die Objekte
  MyObject := CreateComObject(CLSID_ShellLink);
  MySLink := MyObject as IShellLink;
  MyPFile := MyObject as IPersistFile;

  // Erstellt den Namen des Links
  strLinkName := ChangeFileExt(strQuelldatei, '.lnk');
  strLinkName := ExtractFileName(strLinkName);

  // Liest den Speicherort aus der Registry aus
  if enuSpeicherort = _QUICKLAUNCH then
  begin
    Reg := TRegIniFile.Create(QUICK_LAUNCH_ROOT);
    try
      strVerzeichnis := Reg.ReadString('MapGroups', 'Quick Launch', '');
    finally
      Reg.Free;
    end;
  end
  else
  begin
    Reg := TRegIniFile.Create(SHELL_FOLDERS_ROOT);
    try
      case enuSpeicherort of
        _OTHERFOLDER: strVerzeichnis := strUnterverzeichnis;
        _DESKTOP: strVerzeichnis := Reg.ReadString('Shell Folders', 'Desktop', '');
        _STARTMENU: strVerzeichnis := Reg.ReadString('Shell Folders', 'Start Menu', '');
        _SENDTO: strVerzeichnis := Reg.ReadString('Shell Folders', 'SendTo', '');
      end;
    finally
      Reg.Free;
    end;
  end;

  // Falls etwas schief lief ist das Programm hier zu Ende
  // ein Link wird dabei nicht erstellt
  if strVerzeichnis = '' then
    exit;

  // Übergibt den Objekten die entsprechenden Parameter
  MySLink.SetPath(PChar(strQuelldatei));
  MySLink.SetArguments(PChar(strParameter));
  MySLink.SetDescription(PChar(strBeschreibung));
  // Wenn die angaben zum Icon plausibel sind werden Sie übernommen
  // andernfalls werden die Standardeinstellungen genommen
  if (strIconDatei <> '') and (intIconNummer > 0) then
    MySLink.SetIconLocation(PChar(strIconDatei), intIconNummer);
  // Legt fest, in welchem Verzeichnis der Link gespeichert wird
  if (strUnterverzeichnis <> '') and (enuSpeicherort <> _OTHERFOLDER) then
    wstrDateiname := strVerzeichnis + '\' + strUnterverzeichnis + '\' + strLinkName
  else
    wstrDateiname := strVerzeichnis + '\' + strLinkName;
  // Legt fest, in welchem Verzeichnis das Programm ausgeführt wird
  if strArbeitsverzeichnis = '' then
    MySLink.SetWorkingDirectory(PChar(ExtractFilePath(strQuelldatei)))
  else
    MySLink.SetWorkingDirectory(PChar(strArbeitsverzeichnis));

  // Erstellt den Link
  MyPFile.Save(PWideChar(wstrDateiname), False);
  // Übergibt den Pfad des Links als Rückgabewert
  Result := string(wstrDateiname);

end;


Die Funktion kann wie folgt aufgerufen werden.

funErstelleLink(
    'E:\Test\Test.Exe',     // Pfad und Name der Originaldatei
    _DESKTOP,               // Hier soll der Link gespeichert werden
    '',                     // Optional: Ein alternativer Pfad zum speichern des Links
    '',                     // Optional: Das Arbeitsverzeichnis des Programms
    '',                     // Optional: Übergabeparameter an das Programm
    'Dies ist ein Test',    // Optional: Eine Beschreibung des Shortcuts 
    'E:\Test\Test.Exe',     // Optional: Eine Datei, die das alternative Icon enthält
    2                       // Optional: Das Icon das aus der Icondatei angezeigt werden soll
                            //     (Die Zählung der Icons beginnt bei 1)
    );