Es gibt zwei Möglichkeiten Icons aus EXE, DLL und ICO Dateien zu extrahieren: mit API Funktion
ExtractIcon und mit API Funktion
ExtractAssociatedIcon.
Das ist ein Beispiel wie es mit
ExtractAssociatedIcon geht:
Bei ExtractIcon können nur Icons aus den oben angegebenen Dateien extrahiert werden, d.h. die Datei muß Icons enthalten. Enhällt eine Datei, z.B. "c:\autoexec.bat", selbst kein Icons, dann kann man mit ExtractAssociatedIcon einen im System registriertes Icon für die Datei holen.
Hier muß man nicht wissen wieviel Icons die Datei enthällt (wenn erwünscht, dann kann man es mit
ExtractIcon machen [siehe die TotalNumberOfIcons Funktion]). Wird eine höhere Zahl angegeben wie es Icons in der EXE, DLL oder ICO gibt, dann wird das erste Icon zurückgegeben (also keine Fehlermeldung, sondern ein falsches Icon). Enthällt die Datei sellbst kein Icon (z.B. "c:\config.sys"), dann wird das Icon zurückgegeben wie es in der Registry vereinbart wurde.
Aus diesem Grund liefere ich zwei Varianten zum holen eines Icon. Die Einfache: da es bei TXT oder DOC keinen Sinn macht eine Indexzahl anzugeben, wird in dieser Version keine Indexzahl verlangt. Bei EXE, DLL und ICO wird in dieser Version immer das erste Icon zurückgegeben. Dann die normale Variante: hier kann angegeben werden welches Icon in der Reihe zurückgegeben wird. Bei TXT oder DOC wird das registrierte Icon zurückgegeben; Index hat also keinen Einfluß. Bei EXE, DLL und ICO wird das X'te Icon zurückgeliefert:
Einfache Variante:
Die Funktion erwartet zwei Parameter:
- Dateiname einer Datei
- TIcon Objekt für Übergabe des Icons
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| uses ShellApi;
procedure GetAssociatedIconFromFileA(const FileName: String; Icon: TIcon); var Index: Word; begin Index := 0; Icon.Handle:= ExtractAssociatedIcon(HInstance, PChar(FileName), Index); end; |
Beispiel :
Icon für die "autoexec.bat" suchen und auf Formular zeichnen:
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 GetAssociatedIconFromFileA('c:\autoexec.bat', AIcon); Canvas.Draw(0, 0, AIcon); finally AIcon.Free; end; end; |
Normale Variante:
Die Funktion erwartet drei Parameter:
- Dateiname einer Datei
- Index des gewünschten Icons (0 für das erste Icon)
- TIcon Objekt für Übergabe des Icons
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| uses ShellApi;
procedure GetAssociatedIconFromFileB(const FileName: String; Index: Word; Icon: TIcon); var Index2: Word; begin Index2 := Index; Icon.Handle:= ExtractAssociatedIcon(HInstance, PChar(FileName), Index2); end; |
Beispiel :
Das zweite Icon für die "explorer.exe" suchen und auf Formular zeichnen:
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 GetAssociatedIconFromFileB('c:\win98se\explorer.exe', 1, AIcon); Canvas.Draw(0, 0, AIcon); finally AIcon.Free; end; end; |