Delphi获取 EXE、DLL 或 ICO 文件中的图标

//声明:

ExtractIcon(

hInst: HINST; {调用函数的程序实例}

lpszExeFileName: PChar; {文件路径; 文件可以是 *.exe、*.dll、*.ico}

nIconIndex: UINT {图标索引}

): HICON; {返回图标句柄; 索引为 0 时返回第一个图标句柄; 索引为 #FFFFFFFF 时返回图标总数}


unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

uses ShellAPI; {ExtractIcon 在其中声明}

procedure TForm1.Button1Click(Sender: TObject);

var

ico: TIcon;

i,count,x,y,w,h: Integer;

FilePath: string;

begin

{随便找了个路径, 如果缺失会退出}

FilePath := 'C:\Program Files\Macromedia\Fireworks 8\Fireworks.exe';

if not FileExists(FilePath) then begin ShowMessage('文件不存在'); Exit; end;

ico := TIcon.Create;

x := 10; y := 10; w := 0; h := 0;

Repaint;

{先算出文件内的图标总数}

count := ExtractIcon(HInstance, PChar(FilePath), HICON(-1));

for i := 0 to count - 1 do

begin

{循环提取图标}

ico.Handle := ExtractIcon(HInstance, PChar(FilePath), i);

{画出图标}

Canvas.Draw(x,y,ico);

{下面只是调整显示位置}

if w < ico.Width then w := ico.Width;

if h < ico.Height then h := ico.Height;

x := x + ico.Width + 10;

if x >= ClientWidth - w then

begin

x := 10;

y := y + h + 10;

end;

end;

ico.Free;

end;

end.