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.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| uses ShellApi;
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; |
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(0, 0, 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(0, 0, AIcon); ... |
Wie man ein SMALLICON korrekt konvertiert steht hier (
Link).