Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi SHGetFileInfo und 'lnk-files' (https://www.delphipraxis.net/82632-shgetfileinfo-und-lnk-files.html)

xtrnrfe 16. Dez 2006 23:31


SHGetFileInfo und 'lnk-files'
 
Hallo!

Mit dieser Funktion hole ich mir die Icons zu Dateien:

Delphi-Quellcode:
function IconFromFile(S : string): TIcon;
var
  MyIcon : TIcon;
  SHFileInfo: TSHFileInfo;
begin
  MyIcon := TIcon.Create;
  SHGetFileInfo(pchar(S), FILE_ATTRIBUTE_NORMAL, SHFileInfo, SizeOf(SHFileInfo),SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_SMALLICON);
  MyIcon.Handle:= SHFileInfo.hIcon;
  Result:=MyIcon;
end;
Das Problem ist, dass bei Verknüpfungen immer der Pfeil links unten im Icon mit angezeigt wird ... den will ich aber weghaben ... und das reine Icon sehen.

Ich bräuchte eigentlich die Umkehr-Funktion von SHGFI_LINKOVERLAY ... hier werden für alle Dateien die Verknüpfungspfeile angezeigt.

Weiss jemand eine Lösung?

Grüsse und Danke im Vorraus!

Martin K 16. Dez 2006 23:53

Re: SHGetFileInfo und 'lnk-files'
 
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 :wink:

[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 :wink:
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.

xtrnrfe 17. Dez 2006 00:08

Re: SHGetFileInfo und 'lnk-files'
 
Hi Martin!

Bist Du Dir da sicher?
Oh mann ... der Code ist so schön und einfach ... und soll den Pfeil nicht weglassen können?

Das Auslesen von LNK-Files ist doch kompliziert ... und dann das Exe-File mit indizierten anderen Icon oder html-file-Icon dazu suchen noch schwerer.

Geht das vielleicht doch nicht irgendwie?

Grüsse Ralf

Martin K 17. Dez 2006 00:15

Re: SHGetFileInfo und 'lnk-files'
 
Hab gar nich Deinen neuen Post gesehen, also wie gesagt:
Meine Funktion oben kannst Du ja auf das Wesentliche kürzen :wink:

xtrnrfe 17. Dez 2006 00:58

Re: SHGetFileInfo und 'lnk-files'
 
Super!

Das sieht schon besser aus ... ích baus ein, und geb dann Feedback!
Danke!!!!

Grüsse Ralf

xtrnrfe 17. Dez 2006 14:31

Re: SHGetFileInfo und 'lnk-files'
 
Das funzt einwandfrei!

Vielen Dank! Ihr seid echt Spitze!

Grüsse Ralf

Daxon 5. Nov 2009 20:24

Re: SHGetFileInfo und 'lnk-files'
 
Moin,

sorry, dass ich das Thema wieder hochhole, aber ich wollte wegen der Frage keinen neuen Thread aufmachen. Es geht mir dabei um die Funktion von Martin K - nicht um den Icon-Teil, sondern um den gesamten.

Die Funktion selbst funktioniert (jedenfalls meckert der Compiler nicht), allerdings habe ich gerade irgendwie 0 Ahnung, wie ich die Funktion aufrufen kann...?

Danke im vorraus,
daXon

MarcoWarm 6. Nov 2009 09:14

Re: SHGetFileInfo und 'lnk-files'
 
Hi daXon,

welchen Teil brauchst du denn?

Eine "genauere" Implementation gibts hier, da die oben stehende (oder die in der CodeLib) keine "virtuellen" Ordner versteht (z.B. Systemsteuerung etc.)

gruß
Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:34 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