Delphi实现提取可执行文件内部所有图标

在窗体中添加TImage 组件、TOpenDialog组件和TButton组件,TImage组件充当显示文件
内图标的容器,TOpenDialog组件和TButton组件用来激活提示用户选择GIF动画的对话框。

首先在窗体的uses段中添加ShellAPI,然后添加按钮响应代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
LargeIcon, SmallIcon: Hicon;
Num: integer;
begin
if OpenDialog1.Execute then
begin
Self.Image1.Canvas.Refresh;
Num := ExtractIconEx(pchar(OpenDialog1.FileName),
-1,    //设置为-1返回指定文件包含的个数
LargeIcon,
SmallIcon,
1); 
for i := 0 to Num - 1 do   //这样得到最后一个图标是程序本身的图标。
begin
ExtractIconEx(Pchar(OpenDialog1.FileName), i, LargeIcon, SmallIcon, 1);
DrawIcon(image1.Canvas.Handle, (i div 4)*40, (i mod 4)* 40, large);
end;
end;
end;

当用户在程序运行过程中选择一个可执行文件后,程序首先通过self.Image1.Canvas.
Refresh语句清除TImage组件上的显示内容,然后通过将ExtractIconEx函数的第2个参数指定
为-1来取得可执行文件中图标的数目。得到数目后,通过一个循环中的ExtractIconEx (PCh
ar(self.OpenDialog1.FileName), i, Large, Small, 1)语句把可执行文件中的大、小图标
分别存储在Large和Small变量中。最后通过DrawIcon函数在TImage组件上绘制图标。

整个单元程序代码如下:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, shellapi, grids;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
LargeIcon, SmallIcon: Hicon;
Num: integer;
begin
if OpenDialog1.Execute then
begin
Self.Image1.Canvas.Refresh;
Num := ExtractIconEx(pchar(OpenDialog1.FileName),
-1, //设置为-1返回指定文件包含的个数
LargeIcon,
SmallIcon,
1);
for i := 0 to Num - 1 do //这样得到最后一个图标是程序本身的图标。
begin
ExtractIconEx(Pchar(OpenDialog1.FileName), i, LargeIcon, SmallIcon, 1);
DrawIcon(image1.Canvas.Handle, (i div 4)*40, (i mod 4)* 40, LargeIcon);
end;
end;
end;

end.

原文地址:https://www.cnblogs.com/spiritofcloud/p/3978300.html