Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Fr 30.01.04 04:24 
Hier noch eine dritte Möglichkeit (siehe auch Methode 1 und Methode 2) 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 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:

  • Dateiname einer Datei
  • TIcon Objekt für Übergabe des Icons
  • Angabe ob hier das 16x16 große Icon (True) oder das Normale (False) zurückgegeben werden soll.

ausblenden 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:

ausblenden 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:

ausblenden 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).

_________________
Popov