Einzelnen Beitrag anzeigen

Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: SHGetFileInfo und 'lnk-files'

  Alt 17. Dez 2006, 00:53
Bei lnk Verknüpfungen wirst Du wohl das Ziel der Verknüpfung (die Datei, auf die die Verknüpfung verweist) auslesen müssen und von dieser dann das Icon nehmen.
Wie das geht, findest Du alles über die Suche

[Nachtrag]
Da fällt mir grad ein, es geht auch einfacher:
Da das Icon der lnk ja nicht unbedingt das der Datei, auf die die Verknüpfung verweist, sein muss,
kann man auch den Pfad zum Icon und den IconIndex aus der Verknüpfung direkt auslesen.

Diese Funktion liest eine Verknüpfung komplett aus, was IconPath und IconIndex sind sollte wohl klar sein
Du kannst diese Funktion auf Deine Bedürfnisse anpassen und das was Du nicht brauchst weglassen.
Beachte: Die Funktion liefert False, falls die lnk-Datei nicht existiert oder keine gültige lnk-Datei ist.
Delphi-Quellcode:
function ReadLnkFile(const LnkFileName: String; { out Path, Arguments, WorkingDirectory, Description: String; out HotKey: Word; out ShowCmd: Integer; } out IconPath: String; out IconIndex: Integer): Boolean;
var
  Path: String; // <--- das muss dann noch dazu
  ShellLink: IShellLink;
  PersistFile: IPersistFile;
  FileInfo: TWin32FindData;
begin
  Result:=False;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink,nil,CLSCTX_INPROC_SERVER,IShellLink,ShellLink)) then
  begin
    PersistFile:=ShellLink as IPersistFile;
    if SUCCEEDED(PersistFile.Load(StringToOleStr(LnkFileName),STGM_READ)) then
    with ShellLink do
    begin
      SetLength(Path,MAX_PATH+1);
      if SUCCEEDED(GetPath(PChar(Path),MAX_PATH,FileInfo,SLR_ANY_MATCH)) then
      begin
        Path:=PChar(Path);
        Result:=True;
      { SetLength(Arguments,MAX_PATH+1);
        GetArguments(PChar(Arguments),MAX_PATH);
        Arguments:=PChar(Arguments);
        SetLength(WorkingDirectory,MAX_PATH+1);
        GetWorkingDirectory(PChar(WorkingDirectory),MAX_PATH);
        WorkingDirectory:=PChar(WorkingDirectory);
        SetLength(Description,MAX_PATH+1);
        GetDescription(PChar(Description),MAX_PATH);
        Description:=PChar(Description);
        GetHotkey(HotKey);
        GetShowCmd(ShowCmd); }

        SetLength(IconPath,MAX_PATH+1);
        GetIconLocation(PChar(IconPath),MAX_PATH,IconIndex);
        IconPath:=PChar(IconPath);
        if IconPath='then
          IconPath:=Path;
      end
    { else
        Path:=''; }

    end;
  end;
end;
Evtl. musst Du noch diese Units einbinden, damit es funktioniert:
ShlObj, ComObj, ActiveX

//Edit:
Den Teil den Du weglassen kannst, hab ich einfach mal auskommentiert.
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat