首页 > 解决方案 > 如何使用 Delphi 将特定的 32 x 32 图标从 EXE 提取到 TIcon

问题描述

我的目标是从 EXE 文件中仅提取 32 x 32 大小的图标。我是图像处理的新手,但根据 Internet 上的几个示例,我得到了以下代码:

{$IFDEF UNICODE}
function PrivateExtractIcon(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: Integer; phicon: PHANDLE; pIconId: PDWORD; nIcon, flags: DWORD): DWORD; stdcall; external 'user32.dll' name 'PrivateExtractIconsW';
{$ELSE}
function PrivateExtractIcon(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: Integer; phicon: PHANDLE; pIconId: PDWORD; nIcon, flags: DWORD): DWORD; stdcall; external 'user32.dll' name 'PrivateExtractIconsA';
{$ENDIF}

function GetExeIcon(const Path: string; const Size: Integer; Icon: TIcon): Boolean;
var
  hIcon: THandle;
  hIconId: DWORD;
begin
  Result := False;
  if PrivateExtractIcon(PChar(Path), 0, Size, Size,
    @hIcon, @hIconId, 1, LR_LOADFROMFILE) = 1 then
  try
    Icon.Handle := hIcon;
    Result := True;
  finally
    DestroyIcon(hIcon);
  end;
end;

procedure TfrmMain.btnGetIconClick(Sender: TObject);
var
  Icon: TIcon;
begin
  Icon := TIcon.Create;
  try
    if GetExeIcon(edtPath.Text, 32, Icon) then
      Icon.SaveToFile(ExtractFilePath(ParamStr(0)) + 'temp.ico');
  finally
    Icon.Free;
  end;
end;

此代码导致以下错误消息:

位图图像无效

DestroyIcon(hIcon);从函数中删除行时,它可以工作。但比我有内存泄漏。

请,有人可以帮我弄清楚我做错了什么吗?谢谢!

标签: delphiicons

解决方案


推荐阅读