Windows 可執行檔(.exe/.dll)內部常包含多組不同尺寸的圖示資源。Delphi 透過 Shell API ExtractIconEx 即可輕鬆枚舉並提取這些圖示,應用於檔案總管、啟動器、圖示管理工具等場合。
function ExtractIconEx(
lpszFile: PChar; // 目標檔案路徑
nIconIndex: Integer; // -1 取得總數;>=0 提取指定索引
phiconLarge: PIconHandle; // 大圖示控制代碼陣列
phiconSmall: PIconHandle; // 小圖示控制代碼陣列
nIcons: UINT // 要提取的數量
): UINT; stdcall;

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellAPI, ExtCtrls;
type
TfrmMain = class(TForm)
btnOpen: TButton;
OpenDialog1: TOpenDialog;
Image1: TImage;
procedure btnOpenClick(Sender: TObject);
end;
var frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.btnOpenClick(Sender: TObject);
var
i, nIcons: Integer;
Large, Small: HICON;
begin
if OpenDialog1.Execute then begin
// 清空畫布
Image1.Canvas.Refresh;
// 第一次呼叫:nIconIndex = -1 僅取得圖示總數
nIcons := ExtractIconEx(PChar(OpenDialog1.FileName), -1, Large, Small, 1);
// 循環提取每個索引的大圖示並繪製
for i := 0 to nIcons - 1 do begin
ExtractIconEx(PChar(OpenDialog1.FileName), i, Large, Small, 1);
// 4 欄網格佈局:每顆圖示 40x40 像素間距
DrawIcon(Image1.Canvas.Handle, (i div 4) * 40, (i mod 4) * 40, Large);
end;
end;
end;
end.

| 場景 | 處理方式 |
|---|---|
| 提取小圖示 (16x16) | 使用 Small 控制代碼搭配 DrawIcon |
| 取得特定尺寸 (如 32x32, 48x48) | 改用 LoadImage + LR_DEFAULTSIZE 或 SHGetFileInfo |
| 儲存為 .ico 檔案 | 配合 TIcon.SaveToFile 或自行撰寫 ICO 封裝格式 |
| 大量檔案批次處理 | 建立背景執行緒,避免 UI 凍結 |
| 系統圖示快取 | 使用 SHGetFileInfo 取得系統映像清單索引,效能更佳 |
DrawIcon 失敗,檢查 HICON 是否有效、Canvas.Handle 是否就緒HICON 需配對 DestroyIcon 釋放(本範例因程式結束由系統回收,長運行程式必須顯式釋放)掌握 ExtractIconEx 可快速建立圖示瀏覽、替換、匯出等實用工具,是 Delphi 開發者處理 Windows 資源操作的基礎技能之一。