Извлечение пиктограммы из exe, dll или ico-файла в Delphi

Функция SHELLAPI ExtractIconEx:

Обратите внимание — в примере функции объявлены иначе, чем в модуле ShellAPI

type ThIconArray = array[0..0] of hIcon; 
type PhIconArray = ^ThIconArray; 
  
function ExtractIconExA(lpszFile: PAnsiChar; nIconIndex: Integer; phiconLarge : PhIconArray; 
                        phiconSmall: PhIconArray; nIcons: UINT): UINT; stdcall; 
         external 'shell32.dll' name 'ExtractIconExA'; 
function ExtractIconExW(lpszFile: PWideChar; nIconIndex: Integer; phiconLarge: PhIconArray; 
                        phiconSmall: PhIconArray; nIcons: UINT): UINT; stdcall; 
         external 'shell32.dll' name 'ExtractIconExW'; 
  
function ExtractIconEx(lpszFile: PAnsiChar; nIconIndex: Integer; phiconLarge : PhIconArray; 
                       phiconSmall: PhIconArray; nIcons: UINT): UINT; stdcall; 
         external 'shell32.dll' name 'ExtractIconExA'; 
 
procedure TForm1.Button1Click(Sender: TObject); 
var
  NumIcons : integer; 
  pTheLargeIcons : phIconArray; 
  pTheSmallIcons : phIconArray; 
  LargeIconWidth : integer; 
  SmallIconWidth : integer; 
  SmallIconHeight : integer; 
  i : integer; 
  TheIcon : TIcon; 
  TheBitmap : TBitmap; 
begin
  NumIcons:=ExtractIconEx('C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe',
                          -1,nil,nil,0); 
  if NumIcons > 0 then
  begin
    LargeIconWidth := GetSystemMetrics(SM_CXICON); 
    SmallIconWidth := GetSystemMetrics(SM_CXSMICON); 
    SmallIconHeight := GetSystemMetrics(SM_CYSMICON); 
    GetMem(pTheLargeIcons, NumIcons * sizeof(hIcon)); 
    GetMem(pTheSmallIcons, NumIcons * sizeof(hIcon)); 
    FillChar(pTheLargeIcons^, NumIcons * sizeof(hIcon), #0); 
    FillChar(pTheSmallIcons^, NumIcons * sizeof(hIcon), #0); 
    ExtractIconEx('C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe', 0, pTheLargeIcons, pTheSmallIcons, numIcons); 
    {$IFOPT R+}
    {$DEFINE CKRANGE}
    {$R-} 
    {$ENDIF} 
    for i := 0 to (NumIcons - 1) do
    begin
      DrawIcon(Form1.Canvas.Handle, i * LargeIconWidth, 0, pTheLargeIcons^[i]); 
      TheIcon := TIcon. Create; 
      TheBitmap := TBitmap.Create; 
      TheIcon.Handle := pTheSmallIcons^[i]; 
      TheBitmap.Width := TheIcon.Width; 
      TheBitmap.Height := TheIcon.Height; 
      TheBitmap.Canvas.Draw(0, 0, TheIcon); 
      TheIcon.Free; 
      Form1.Canvas.StretchDraw(Rect(i * SmallIconWidth, 100, (i + 1) * SmallIconWidth, 100 + SmallIconHeight), TheBitmap); 
      TheBitmap.Free; 
    end; 
    {$IFDEF CKRANGE}
    {$UNDEF CKRANGE}
    {$R+} 
    {$ENDIF} 
    FreeMem(pTheLargeIcons, NumIcons * sizeof(hIcon)); 
    FreeMem(pTheSmallIcons, NumIcons * sizeof(hIcon)); 
  end; 
end; 
  
end. 
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (11 оценок, среднее: 5,00 из 5)
Загрузка...
Добавить комментарий