首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 利用 ExtractIconEx 從可執行檔提取所有圖示並顯示

     編輯:Delphi

Windows 可執行檔(.exe/.dll)內部常包含多組不同尺寸的圖示資源。Delphi 透過 Shell API ExtractIconEx 即可輕鬆枚舉並提取這些圖示,應用於檔案總管、啟動器、圖示管理工具等場合。

核心 API:ExtractIconEx

function ExtractIconEx(
  lpszFile: PChar;        // 目標檔案路徑
  nIconIndex: Integer;    // -1 取得總數;>=0 提取指定索引
  phiconLarge: PIconHandle; // 大圖示控制代碼陣列
  phiconSmall: PIconHandle; // 小圖示控制代碼陣列
  nIcons: UINT            // 要提取的數量
): UINT; stdcall;

實作步驟

1. 介面佈局

  • TOpenDialog:選擇目標 .exe 檔案
  • TButton:觸發提取
  • TImage:繪製提取出的圖示網格

設計介面:Button + OpenDialog + Image

2. 核心程式碼

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.

3. 執行結果

初始畫面   提取圖示結果:4xN 網格顯示

進階應用與注意事項

場景處理方式
提取小圖示 (16x16)使用 Small 控制代碼搭配 DrawIcon
取得特定尺寸 (如 32x32, 48x48)改用 LoadImage + LR_DEFAULTSIZE 或 SHGetFileInfo
儲存為 .ico 檔案配合 TIcon.SaveToFile 或自行撰寫 ICO 封裝格式
大量檔案批次處理建立背景執行緒,避免 UI 凍結
系統圖示快取使用 SHGetFileInfo 取得系統映像清單索引,效能更佳

常見問題排查

  • 提取數量為 0:檔案不存在、路徑錯誤、非 PE 格式檔案、或檔案損毀
  • 圖示顯示空白/黑框:DrawIcon 失敗,檢查 HICON 是否有效、Canvas.Handle 是否就緒
  • 記憶體洩漏:提取的 HICON 需配對 DestroyIcon 釋放(本範例因程式結束由系統回收,長運行程式必須顯式釋放)

掌握 ExtractIconEx 可快速建立圖示瀏覽、替換、匯出等實用工具,是 Delphi 開發者處理 Windows 資源操作的基礎技能之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved