Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
236 views
in Technique[技术] by (71.8m points)

How to extract specific 32 x 32 icon from EXE to a TIcon with Delphi

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

56.9k users

...