怎么样提交文件里的大图标?

问答知识库用户 |浏览288次
收藏|2014/05/17 22:00
一个EXE使用普通的提取图标的方法只能提取到32*32的图标,但我看到Q+这些软件能提取到大图标,WIN7 下也是显示大图标的,是如何实现的呢?

满意回答

2014/05/17 22:00

以下代码网络上搜集的:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
//{$IFDEF UNICODE}
//function PrivateExtractIcons(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer; phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD; stdcall ; external 'user32.dll' name 'PrivateExtractIconsW';
//{$ELSE}
//function PrivateExtractIcons(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer; phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD; stdcall ; external 'user32.dll' name 'PrivateExtractIconsA';
//{$ENDIF}

/// <author>
/// Code by Siow http://vshui.com
///</author>
/// <summary>
/// 提取大于32*32的图标
/// </summary>
function ExtractIcons(exeFilename: string; icoSize: Integer; var hIcon: THandle; nIconIndex:
  Integer = 0): Boolean;
const
{$ifdef UNICODE}
 ExtractProcName='PrivateExtractIconsW';
{$else}
 ExtractProcName='PrivateExtractIconsA';
{$endif}
type
  TExtractFunc = function(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer;
    phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD; stdcall;
var
  nIconId: DWORD;
  PrivateExtractIcons: TExtractFunc;
  hDll: THandle;
begin
  result := False;

  hDll := LoadLibrary('user32.dll');
  if (hDll < 4) then exit;
  try
    PrivateExtractIcons := GetProcAddress(hDll, ExtractProcName);

    if not Assigned(PrivateExtractIcons) then
      exit;

    if PrivateExtractIcons(PChar(exeFilename),
      nIconIndex, icoSize, icoSize, @hIcon, @nIconId, 1, LR_SHARED) <> 0
      then
      result := true;
  finally
    FreeLibrary(hDll);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  hIco: THandle;
begin
  s := 'C:Program FilesInternet Exploreriexplore.exe';
  if ExtractIcons(s, 256, hIco, 0) then
  try
    DrawIconEx(Canvas.Handle, 0, 0, hIco, 256, 256, 0, 0, DI_NORMAL);
  finally
    DestroyIcon(hIco);
  end;

end;
end.

热心网友

其他回答(0)
0人关注该问题
待解决问题



+1
 加载中...