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 00:22 
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 ExtractIcon geht:

Bei ExtractIcon können nur Icons aus den oben angegebenen Dateien extrahiert werden, d.h. die Datei muß Icon enthalten. Die Funktion kann in zweifacher Weise genutzt werden:

  1. den Icon einer Datei extrahieren;
  2. auslesen wieviel Icons die Datei enthällt

Zuerst müssen man also erfahren wieviele Icons in der Datei drinn sind. Wird eine höhere Zahl angegeben wie es Icons gibt, dann wir kein Icon zurückgegeben.

Funktion zum Auslesen der Icon Anzahl:

Die Funktion erwartet ein Parameter:
  • Dateiname einer EXE, DLL oder ICO Datei

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
uses
  ShellApi;

// Gibt Anzahl Icons aus EXE, DLL oder ICO.
function TotalNumberOfIcons(const FileName: String): Integer;
begin
  if not FileExists(FileName) then Result := -1
//    else Result := ExtractIcon(HInstance, PChar(FileName), -1); Fehler korrigiert.
    else Result := ExtractIcon(HInstance, PChar(FileName), $FFFFFFFF);
end{Popov}

Korrekturhinweis von user profile iconJayK.

Funktion zum Extrahieren eines Icon's:

Die Funktion erwartet drei Parameter:

  • Dateiname einer EXE, DLL oder ICO Datei
  • Index des gewünschten Icons (0 für das erste Icon)
  • TIcon Objekt für Übergabe des Icons

Die Funktion gibt True zurück wenn alles geklappt hat und False wenn entweder die Datei nicht existiert hat oder der Index-Wert falsch war.

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

// Gibt Icon zurück aus EXE, DLL oder ICO.
function GetIconFromFileA(const FileName: String; Index: Word;
  Icon: TIcon): Boolean;
begin
  Result := False;
  if (TotalNumberOfIcons(FileName) < 1or
     ((Index + 1 ) > TotalNumberOfIcons(FileName)) then
    Exit;

  Icon.Handle := ExtractIcon(HInstance, PChar(FileName), Index);
  Result := True;
end{Popov}


Beispiele:

Beispiel 1:

Icon aus Explorer.exe extrahieren und auf Formular zeichnen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var
  AIcon: TIcon;
begin
  AIcon := TIcon.Create;
  try
    if GetIconFromFileA('c:\windows\explorer.exe'0, AIcon) then 
      ShowMessage('Alles klar');
    Canvas.Draw(00, AIcon);
  finally
    AIcon.Free;
  end;
end;


Beispiel 2:

Icon extrahieren und als Formular-Icon nehmen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if GetIconFromFileA('c:\windows\explorer.exe'0, Icon) then 
    ShowMessage('Alles klar');
end;


Moderiert von user profile iconjasocul: Fehler im Source korrigiert. 23.10.2005