delphi - 如何使用 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);
从函数中删除行时,它可以工作。但比我有内存泄漏。
请,有人可以帮我弄清楚我做错了什么吗?谢谢!