My go is to extract only 32 x 32 size icon from EXE files. I'm new to image manipulation, but based on several examples found on Internet I got this code:
{$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;
This code result in the following error message:
Bitmap image is not valid
When removing the line DestroyIcon(hIcon);
from the function, it works. But than I have a memory leak.
Please, can someone help me to figure out what I am doing wrong? Thanks!
question from:
https://stackoverflow.com/questions/65926888/how-to-extract-specific-32-x-32-icon-from-exe-to-a-ticon-with-delphi 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…