AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Icon aus beliebiger Datei extrahieren (z.B. *.lnk)
Thema durchsuchen
Ansicht
Themen-Optionen

Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

Ein Thema von Martin K · begonnen am 20. Okt 2005 · letzter Beitrag vom 20. Okt 2005
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Martin K
Martin K

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

Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 15:34
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!
  Mit Zitat antworten Zitat
kingflo

Registriert seit: 21. Jun 2004
Ort: Hamburg
502 Beiträge
 
Delphi 7 Professional
 
#2

Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 16:08
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;
Florian Gilde
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

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

Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 16:27
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?
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 16:50
Theoretisch müsste es so funken:
Delphi-Quellcode:
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');
mit der Praxis sieht es immer ein bisschen anders aus

als iconhandle gibt er immer 0 raus
Michael Enßlin
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

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

Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 17:06
Hab deinen Code mal getestet, das Programm läuft auch.

Hab das noch unten hinzugefügt:
  Image1.Picture.Icon:=i; aber es wird einfach nix im Image1 angezeigt.

Dann kommen noch diese Meldungen:
Zitat:
[Warning] Unit1.pas(39): Variable 'c1' might not have been initialized
[Warning] Unit1.pas(39): Variable 'c2' might not have been initialized
[Warning] Unit1.pas(39): Variable 'c3' might not have been initialized
Aber daran kann's ja wohl nich liegen...

Irgend eine Idee ?
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 17:12
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

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.
Michael Enßlin
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

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

Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 17:18
Was sind denn für Daten in einem _shfileinfoa drin?
Und was ist das überhaupt?
(Also in diesem Fall das 'psfi')
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 17:23
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 psfi. ein, dann müsste er dir alle enthaltenen Typen auflisten (Programmierhilfe)
Michael Enßlin
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

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

Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 17:34
Danke, das hab ich schon.
Meinst du, man sollte in psfi schon ein paar Werte reinschreiben, bevor
shgetfileinfo(pansichar(filename),1,psfi,1,1); aufgerufen wird ?

Hab das im Forum gefunden:
Delphi-Quellcode:
tmpImgLst.Handle := SHGetFileInfo(PChar(FName),0,FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX or SHGFI_ICON);
tmpImgLst.GetBitmap(FileInfo.iIcon,tmpBitmap);
Meinst du, das hilft uns weiter?
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Icon aus beliebiger Datei extrahieren (z.B. *.lnk)

  Alt 20. Okt 2005, 17:34
Jetzt hab ichs:
DP zu Fileicon

der Thread (ist das richtig geschrieben?) wirkt ziemlich selbstsicher.

Da heisst es so:

Delphi-Quellcode:
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;
das geht

Michael Enßlin
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 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