![]() |
SHGetFileInfo und 'lnk-files'
Hallo!
Mit dieser Funktion hole ich mir die Icons zu Dateien:
Delphi-Quellcode:
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.
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; 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! |
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:
Evtl. musst Du noch diese Units einbinden, damit es funktioniert:
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; ShlObj, ComObj, ActiveX //Edit: Den Teil den Du weglassen kannst, hab ich einfach mal auskommentiert. |
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 |
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: |
Re: SHGetFileInfo und 'lnk-files'
Super!
Das sieht schon besser aus ... ích baus ein, und geb dann Feedback! Danke!!!! Grüsse Ralf |
Re: SHGetFileInfo und 'lnk-files'
Das funzt einwandfrei!
Vielen Dank! Ihr seid echt Spitze! Grüsse Ralf |
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 ![]() 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 |
Re: SHGetFileInfo und 'lnk-files'
Hi daXon,
welchen Teil brauchst du denn? Eine "genauere" Implementation gibts ![]() gruß Marco |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz