// Es können Icons aus EXE-, ICO-, ICL- oder DLL-Dateien extrahiert werden.

// Getestet mit D4 unter XP

uses shellapi; 
 
function IconAnzahl(Datei: string): integer; 
var idx: integer; 
begin 
  idx := $FFFFFFFF; 
  result := ExtractIcon(hinstance, pchar(datei), idx); 
end; 
 
function HolIcon(Datei: string; Stelle: integer): HIcon; 
begin 
// Zählung beginnt bei 0, deshalb Stelle-1 
  result := ExtractIcon(hinstance, pchar(datei), Stelle - 1); 
end; 
 
 
// Beispielaufruf, um ein einzelnes Icon anzusehen 
 
procedure TForm1.Button3Click(Sender: TObject); 
var 
  H: HIcon; 
  welches, wieviel: integer; 
  fl: string; 
begin 
  fl := 'c:\windows\system32\moricons.dll'; 
  welches := 20; // das 20. Icon in der Datei 
  if fileexists(fl) then begin 
    wieviel := IconAnzahl(fl); 
    if (wieviel > 0) then begin 
      if (wieviel >= welches) then begin 
        H := HolIcon(fl, welches); 
        drawicon(canvas.handle, 10, 10, H); 
        destroyicon(H); 
      end else 
        showmessage('Anforderung ist höher als Anzahl'); 
    end else 
      showmessage('Datei enthält keine Icons'); 
  end else 
    showmessage('Datei nicht gefunden'); 
end; 
 
 
// simpler Iconbetrachter 
 
procedure TForm1.Button2Click(Sender: TObject); 
const 
  fl = 'c:\windows\system32\shell32.dll'; 
  links = 10; 
  oben = 10; 
  dazwischenfrei = 5; 
var 
  x, y, anzahl, nebeneinander, untereinander, breite, hoehe: integer; 
begin 
  breite := GetSystemMetrics(SM_CXICON) + dazwischenfrei; 
  hoehe := GetSystemMetrics(SM_CYICON) + dazwischenfrei; 
  nebeneinander := 20; 
  anzahl := IconAnzahl(fl); 
  if anzahl > 0 then begin 
    if anzahl < nebeneinander then nebeneinander := anzahl; 
    untereinander := (anzahl div nebeneinander) + 
      ord(anzahl mod nebeneinander > 0); 
    for y := 0 to untereinander - 1 do 
      for x := 0 to nebeneinander - 1 do 
        drawicon(canvas.handle, links + x * breite, oben + y * hoehe, 
          holicon(fl, y * nebeneinander + x + 1)); 
  end else showmessage('Anzeige nicht möglich'); 
end;


Zugriffe seit 6.9.2001 auf Delphi-Ecke