Entwickler-Ecke

Windows API - ...Icon für eine beliebige Datei holen #2 (mit SMALLICON's)


Popov - Fr 30.01.04 04:24
Titel: ...Icon für eine beliebige Datei holen #2 (mit SMALLICON's)
Hier noch eine dritte Möglichkeit (siehe auch Methode 1 [http://www.delphiforum.de/viewtopic.php?t=21351] und Methode 2 [http://www.delphiforum.de/viewtopic.php?t=21352]) wie man Icons aus EXE, DLL und ICO Dateien extrahiert oder den passenden Icon zu einem unter Windwows registrierten Dateityp erhällt. Wie bei ExtractAssociatedIcon, kann also auch hier ein passender Icon für den Dateityp TXT oder BAT oder DOC zurückgegeben werden. Hier kann man aber auch die 16x16 großen Icons (SMALLICON) erhalten.

Das ist ein Beispiel wie es mit SHGetFileInfo [http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/functions/shgetfileinfo.asp] geht:

Allerdings ist diese Variante etwas schwieriger, auch wenn die Funktion nicht besonders kompliziert aussieht. Andereseits ist das eine mächtige Variante, da es hier viele Einstellmöglichkeiten gibt. Das liegt an der API Funktion SHGetFileInfo. Hier wird ein Record zurückgegeben der neben vielen Informationen auch die Möglichkeit liefert, neben dem normalen Icon, auch das kleine Icon zurückzugeben. Hier beachten wir allerdings nicht die ganzen Möglichkeiten, sondern beachten nur auf die Möglichkeit ein Icon zurückzuliefern.

Die Funktion erwartet drei Parameter:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
uses
  ShellApi;

// Gibt den Icon einer EXE, DLL oder ICO oder eines 
// registrierten Dateityps (bei TXT z.B. von Notepad.exe)
procedure GetIconFromFileB(const FileName: String; Icon: TIcon;
  SmallIcon: Boolean);
var
  sfi: TSHFILEINFO;
const
  uFlags : array[Boolean] of DWord = (SHGFI_LARGEICON, SHGFI_SMALLICON);
begin
  if SHGetFileInfo(PChar(FileName), 0, sfi, SizeOf(sfi), SHGFI_ICON or
    uFlags[SmallIcon]) <> 0 then
    Icon.Handle := sfi.hIcon;
end{Popov}


Beispiele:

Das Symbol für den Dateityp BAT wird erfragt und auf Formular gezeichnet:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var
  AIcon: TIcon;
begin
  AIcon := TIcon.Create;
  try
    GetIconFromFileB('c:\autoexec.bat', AIcon, False);
    Canvas.Draw(00, AIcon);
  finally
    AIcon.Free;
  end;
end;


Hier wird das SMALLICON von Explorer erfragt und gezeichnet:


Delphi-Quelltext
1:
2:
3:
4:
...
    GetIconFromFileB('c:\windows\explorer.exe', AIcon, True);
    Canvas.Draw(00, AIcon);
...


Wie man ein SMALLICON korrekt konvertiert steht hier (Link [http://www.delphiforum.de/viewtopic.php?t=21353]).