![]() |
Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Hallo
wie kann man aus einer beliebigen Datei das dazugehörige Icon ermitteln? Sollte nicht nur bei EXE-Dateien gehen, wie z.B. bei ExtractIconEx - sondern auch z.B. bei *.lnk Verknüpfungen. Komme ich da mit SHGetFileInfo weiter? Am besten wäre, ich bekomme das Icon der *.lnk als TBitmap geliefert. Danke, schon im Voraus! |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Also bei exe funzt dieser code bei anderen sachen hab ichs noch net getestet und kann ich hier leider auch nicht versuchs einfach...
Delphi-Quellcode:
function GetDefaultIcon(Filename: Widestring; IconTyp: Cardinal = 2): HIcon;
var Info: TSHFileInfoW; Flags: Cardinal; ext: WideString; idx: word; begin //Result := Ticon.Create; ext := WideExtractFileExt(Filename); idx := 0; if WideFileExists(Filename) then begin result := Tnt_ExtractAssociatedIconW(HInstance, PWideChar(Filename), idx); exit; end; {if ext = '.ico' then begin result := LoadFromFile(Filename); exit; end;} begin {DW 1.4} Flags := 0; case IconTyp of 0: Flags := SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES; 1: Flags := SHGFI_ICON or SHGFI_LARGEICON or SHGFI_USEFILEATTRIBUTES; 2: Flags := SHGFI_ICON or SHGFI_SHELLICONSIZE or SHGFI_USEFILEATTRIBUTES; end; Tnt_SHGetFileInfoW(PWideChar(ext), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), Flags); Result := Info.hIcon; end; end; {TntWiindows.pas} function Tnt_ExtractAssociatedIconW(hInst: HINST; lpIconPath: PWideChar; var lpiIcon: Word): HICON; begin if Win32PlatformIsUnicode then Result := ExtractAssociatedIconW{TNT-ALLOW ExtractAssociatedIconW}(hInst, lpIconPath, lpiIcon) else Result := ExtractAssociatedIconA{TNT-ALLOW ExtractAssociatedIconA}(hInst, PAnsiChar(AnsiString(lpIconPath)), lpiIcon) end; |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Danke schon mal für deinen Code,
aber da kommen bei mir versch. "Undeclared identifier", z.B. bei 'WideFileExists'. Fehlt da ein Eintrag in uses ? bei EXE-Dateien ist das nochmal was anderes, weil das Icon in der exe integriert ist. Bei einer *.lnk Verknüpfung ist ja nur ein Verweis drin, der auf ein Icon zeigt (z.B. wenn man in Windows die Eigenschaften einer Verknüpfung aufruft und dann auf "Anderes Symbol" klickt, erhält man diesen Verweis auf das Icon). Diesen Verweis einer *.lnk will ich jetzt mit Delphi auslesen, und dann das Icon in ein TBitmap laden. Der Verweis zeigt meißtens auf eine EXE-Datei, ICO-Datei oder DLL-Datei, die dann das Icon enthalten. Also müsste ich erst den Verweis auf das Icon auslesen, und dann das Icon aus der EXE, ICO oder DLL extrahieren und in ein TBitmap laden. Weiß da jemand eine Lösung? |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Theoretisch müsste es so funken:
Delphi-Quellcode:
mit der Praxis sieht es immer ein bisschen anders aus :wall:
uses
shellapi [...] function iconhandle(filename:string):hicon; var psfi:_shfileinfoa; c1,c2,c3:cardinal; begin shgetfileinfo(pansichar(filename),c1,psfi,c2,c3); result:=psfi.hicon; end; //Verwendung: var i:ticon; begin i:=ticon.Create; i.Handle:=iconhandle('c:\file.lnk'); als iconhandle gibt er immer 0 raus :? |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Hab deinen Code mal getestet, das Programm läuft auch.
Hab das noch unten hinzugefügt:
Delphi-Quellcode:
aber es wird einfach nix im Image1 angezeigt.
Image1.Picture.Icon:=i;
Dann kommen noch diese Meldungen: Zitat:
Irgend eine Idee ? :gruebel: |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
die Funktion will noch andere Werte zurückliefern, die aber uninterresant sind. ich muss aber variablen angeben, in die die Funktion sie speichern will. Also helf ich mir mit c1, c2 und c3 aus. Diese Variablen sind vollkommen unbedeutend.
Die Funktion liefert irgendwie immer das Icon-Handle 0 zurück... :? psfi.hicon in der Funktion hat aber noch nen wert :gruebel: oder doch nicht? gerade hat das showmessage eine Zahl ausgegeben. Das war aber, als ich eine nicht existierende Datei probiert hab. Versuch mal im Forum zu suchen. Da gibt's bestimmt was. |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Was sind denn für Daten in einem _shfileinfoa drin?
Und was ist das überhaupt? (Also in diesem Fall das 'psfi') |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
das isn record.
die Funktion shgetfileinfo braucht eben das als Parameter. Es enthält meherere Informationen, die von der Funktion dann gesetzt werden. Gib mal innerhalb der iconhandle-funktion die Buchstabenfolge
Delphi-Quellcode:
ein, dann müsste er dir alle enthaltenen Typen auflisten (Programmierhilfe)
psfi.
|
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Danke, das hab ich schon.
Meinst du, man sollte in psfi schon ein paar Werte reinschreiben, bevor
Delphi-Quellcode:
aufgerufen wird ?
shgetfileinfo(pansichar(filename),1,psfi,1,1);
Hab das im Forum gefunden:
Delphi-Quellcode:
Meinst du, das hilft uns weiter?
tmpImgLst.Handle := SHGetFileInfo(PChar(FName),0,FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX or SHGFI_ICON);
tmpImgLst.GetBitmap(FileInfo.iIcon,tmpBitmap); |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Jetzt hab ichs:
![]() der Thread (ist das richtig geschrieben?) wirkt ziemlich selbstsicher. Da heisst es so:
Delphi-Quellcode:
das geht
procedure TForm1.DrawFile(Name: String);
var FileInfo: TSHFileInfo; ImageListHandle: THandle; aIcon: TIcon; begin // Speicher löschen FillChar(FileInfo, SizeOf(FileInfo), #0); // Handle der Image Liste der ausgewählten Datei ermitteln ImageListHandle := SHGetFileInfo( PChar(Name), 0, FileInfo, SizeOf(FileInfo), // großes Icon verlangen SHGFI_ICON or SHGFI_LARGEICON ); try // TIcon Objekt erstellen aIcon := TIcon.Create; try // Icon Handle zuweisen aIcon.Handle := FileInfo.hIcon; // Transparent darstellen aIcon.Transparent := True; with PaintBox1 do begin // Paintbox auf die entsprechende Größe bringen Width := aIcon.Width; Height := aIcon.Height; Application.ProcessMessages; // Paintbox löschen Canvas.Rectangle(-1, -1, Succ(Width), Succ(Height)); // Icon darstellen Canvas.Draw(0, 0, aIcon); end; finally // TIcon Objekt freigeben FreeAndNil(aIcon); end; finally // Icon der Shell wieder freigeben DestroyIcon(FileInfo.hIcon); // Icon Liste der Shell wieder freigeben ImageList_Destroy(ImageListHandle); end; end; :bouncing4: :cheers: |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Jo, danke erst mal.
Aber die letzte Zeile will Delphi irgendwie nich annehmen... |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
leider, leider, leider....
funzt bei mir immer noch nich! :cry: Was hast Du gemacht, damit's geht ??? Hab die letzt Zeile einfach weggelassen und PaintBox1 mit Image1 ersetzt. Programm läuft auch, aber das Image1 ist einfach nur weiß... |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
die kannste rausnehmen :) hab ich auch gemacht. es könnte dann nur sein, dass du, wenn du 1000000 Icons ausgelesen hast, der Speicher voll is, weil du die Imagelist nicht mehr leermachst [zur letzten Zeile]
du musst den Code eben so weit abkürzen, dass er sich nurnoch um das Icon kümmert. Ich machs mal schnell... |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Warum läufts bei mir nich?
:roll: :cry: :? :( :coder2: ????? |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Jau, so gehts auch:
Delphi-Quellcode:
der liefert dir dann ein gültiges Icon zurück.
function FileIcon(Name: String):ticon;
var FileInfo: TSHFileInfo; ImageListHandle: THandle; aIcon: TIcon; begin FillChar(FileInfo, SizeOf(FileInfo), #0); ImageListHandle := SHGetFileInfo( PChar(Name), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_LARGEICON ); try aIcon := TIcon.Create; try aIcon.Handle := FileInfo.hIcon; aIcon.Transparent := True; except end; except end; result:=aicon; end; |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
warte mal....
Hab grad als Parameter einfach '' übergeben, also:
Delphi-Quellcode:
Und es wird das Windows-Ordner Symbol angezeigt !!!
DrawFile('');
? Muss also an der *.lnk Datei liegen ? |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Der neue Code funzt auch nur, wenn ich einen Ordner also
Delphi-Quellcode:
übergebe.
Image1.Picture.Icon:=FileIcon('');
Aber nicht bei meiner *.lnk Datei :cry: Geht's denn bei dir mit einer *.lnk Verknüpfung ? |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
lnks kann er bei mir schon auslesen. mach mal nicht image1.picture.icon sondern image1.canvas.draw(fileicon(filename));
hier mal mein source:
Delphi-Quellcode:
bei mir stellt er das ausgelesene Icon als Anwendungssymbol ein. Klappt prima.
function FileIcon(Name: String):ticon;
var FileInfo: TSHFileInfo; ImageListHandle: THandle; aIcon: TIcon; begin FillChar(FileInfo, SizeOf(FileInfo), #0); ImageListHandle := SHGetFileInfo( PChar(Name), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_LARGEICON ); try aIcon := TIcon.Create; try aIcon.Handle := FileInfo.hIcon; aIcon.Transparent := True; except end; except end; result:=aicon; end; procedure TForm1.Button1Click(Sender: TObject); begin if not opendialog1.Execute then exit; Application.Icon:=fileicon(opendialog1.FileName); end; [edit] sch... eigentlich müsste ich ja eine dialektische Erörterung als Deutsch-Hausaufgabe schreiben... aber Mammi wird schon nicht schauen. |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Bei
Delphi-Quellcode:
kommt:
image1.canvas.draw(fileicon(.......));
Zitat:
|
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Hmm... Deutsch...
Also ich hab Herbstferien!!! Übrigens kannst du deinen Code noch vereinfachen:
Delphi-Quellcode:
Aber vielen vielen Dank für deine Hilfe, werd's schon hinkriegen! :coder2:
procedure TForm1.Button1Click(Sender: TObject);
begin if opendialog1.Execute then Application.Icon:=fileicon(opendialog1.FileName); end; |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
integer ist der Typ eines Handles. Du versuchst, einem Icon.Handle ein Icon zuzuweisen. Du musst einem Icon.Handle ein Icon.Handle zuweisen.
|
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Hmm...
irgendwie geht's immer noch nich. Selbst bei:
Delphi-Quellcode:
hab ich das normale Windows-Programm-Symbol bei beiner Application, aber nicht das der '.lnk
Application.Icon:=fileicon(....);
|
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Ou, Ou Ou Ou.... :wall:
hab die ganze Zeit den Falschen Ordner übergeben, und da gab's die *.lnk Datei dann natürlich nich. Jo, bei mir funzts jetzt auch prima!!! :thumb: Vielen Dank, nochmal... hast mir wirklich weitergeholfen! :spin2: |
Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Für alle, die das Icon aus einer beliebigen Datei haben möchten,
hier der endgültige Quellcode:
Delphi-Quellcode:
Vielen Dank nochmal an ichbins
uses ... ShellApi;
... function FileIcon(FileName: String): TIcon; var FileInfo: TSHFileInfo; AIcon: TIcon; begin FillChar(FileInfo,SizeOf(FileInfo),#0); SHGetFileInfo(PChar(FileName),0,FileInfo,SizeOf(FileInfo),SHGFI_ICON or SHGFI_LARGEICON); AIcon:=TIcon.Create; Try AIcon.Handle:=FileInfo.HIcon; AIcon.Transparent:=True; Except end; Result:=AIcon; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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