// Hiermit kann man Informationen aus einem Shortcut (*.lnk) lesen.
// Soll dieser Code im Projekt-Quelltext eingesetzt werden, müssen die Units
// "
WINDOWS" und "SYSUTILS" mit angegeben werden. Falls man dabei
// "
Application.Initialize" nicht einsetzt (z.B. bei Programmen ohne "Forms"),
// muss "
CoInitialize" aufgerufen werden, ansonsten muss der Aufruf der
// Funktion eben erst nach
"Application.Initialize" erfolgen.

// Siehe auch:
Programmgruppen und Shortcuts erstellen


// Getestet mit D4 unter WinME

uses {windows, sysutils,} ShlObj, ActiveX, ComObj;

function GetLinkInfo(LNK: widestring; var lnkpfad, lnkarg, lnkdir, 
  lnkico: string; var IDX: integer): boolean; 
var 
  IUKN: IUnknown; 
  ISL: IShellLink; 
  IPF: IPersistFile; 
  WFD: TWin32FindData; 
  BUF: PChar; 
begin 
  result := false; 
  {if not SUCCEEDED(CoInitialize(nil)) then exit;}
  BUF := StrAlloc(MAX_PATH); 
  IUKN := CreateComObject(CLSID_ShellLink); 
  ISL := IUKN as IShellLink; 
  IPF := IUKN as IPersistFile; 
  if SUCCEEDED(IPF.Load(PWChar(LNK), STGM_READ)) then begin 
    if SUCCEEDED(ISL.GetPath(BUF, MAX_PATH, WFD, 0)) then begin 
      lnkpfad := BUF; 
      if SUCCEEDED(ISL.GetIconLocation(BUF, MAX_PATH, IDX)) then begin 
        lnkico := BUF; 
        if lnkico = '' then lnkico := lnkpfad else 
          if copy(lnkico, 1, 12) = '%SystemRoot%' then begin 
            getwindowsdirectory(BUF, MAX_PATH); 
            lnkico := BUF + copy(lnkico, 13, maxint); 
          end; 
        if SUCCEEDED(ISL.GetArguments(BUF, MAX_PATH)) then begin 
          lnkarg := trim(stringreplace(BUF, '"', '', [rfreplaceall])); 
          if SUCCEEDED(ISL.GetWorkingDirectory(BUF, MAX_PATH)) then begin 
            lnkdir := BUF; 
            result := true; 
          end; 
        end; 
      end; 
    end; 
  end; 
  StrDispose(BUF); 
end; 
 
// Beispielaufruf 
procedure TForm1.Button3Click(Sender: TObject); 
var 
  Link, Datei, Parameter, Arbeitsverzeichnis, IconPfad: string; 
  IconIdx: integer; 
begin 
  Link := 'C:\Windows\Desktop\winamp3.lnk'; 
  if getlinkinfo(Link, Datei, Parameter, Arbeitsverzeichnis, IconPfad, IconIdx) 
    then begin 
    Label1.Caption := 'Datei --> ' + Datei; 
    if Parameter = '' then 
      Label2.Caption := '(keine Parameter)' else 
      Label2.Caption := 'Parameter --> ' + Parameter; 
    if Arbeitsverzeichnis = '' then 
      Label3.Caption := '(kein Arbeitsverzeichnis)' else 
      Label3.Caption := 'Arbeitsverzeichnis --> ' + Arbeitsverzeichnis; 
    Label4.Caption := 'Icon-Lokalisation -->' + Iconpfad + ', ' + 
      inttostr(IconIdx); 
  end else begin 
    Label1.Caption := 'FEHLER'; 
    Label2.Caption := ''; 
    Label3.Caption := ''; 
    Label4.Caption := ''; 
  end; 
end;



Zugriffe seit 6.9.2001 auf Delphi-Ecke