获取EXE.Dll中的图标文件

学习几个API,大部分参考百度

ExtractIcon用于获取图标文件

HICON ExtractIcon(

    HINSTANCE hInst, // instance handle
    LPCTSTR lpszExeFileName, // filename of file with icon
    UINT nIconIndex  // index of icon to extract
   );

说明 - 获取包含在可执行文件或 DLL 中的图标数或图标句柄. 图标索引范转从 0 图标数减. 要获取图标数, 传递 -1.

参数 - hInst 是应用程序实例句柄. 调用 GetClassLong 来获取该值.

lpszExeFileName
一个指向要获取相关图标的文件的指针. 该文件可以用在注册表中的应用程序的文件扩展名来关联.

LpiIcon
图标索引 (以零为基数).

返回的是图标的句柄,如果文件里为空,返回值为空

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Forms,
  Dialogs, StdCtrls, ExtCtrls, ShellAPI, Menus, Controls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    Edit2: TEdit;
    Panel1: TPanel;
    Image1: TImage;
    SaveDialog1: TSaveDialog;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure Edit2Click(Sender: TObject);
  private
    { Private declarations }
    procedure WMDROPFILES(var Message: TWMDROPFILES); message WM_DROPFILES; //很重要.不能少
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}
//使用API函数ExtractIcon() 从 .exe 或 .dll中提取icon
{
首先要说明的是下面的三个API函数
VOID DragAcceptFiles(

    HWND hWnd, // handle to the registering window
    BOOL fAccept // acceptance option
   );
DragAcceptFiles函数是用来为拖放文件作初始化, 它的第一个参数hWnd指明目标窗体的
句柄,第二个参数fAccept是一个布尔型变量,为True时 则hWnd所指向的窗体可以接受拖放的文件.

UINT DragQueryFile(

    HDROP hDrop, // handle to structure for dropped files
    UINT iFile, // index of file to query
    LPTSTR lpszFile, // buffer for returned filename
    UINT cch  // size of buffer for filename
   );
DragQueryFile函数用来查询拖放文件的文件名,其 本身的返回值是一个无符号整数,参数hDrop是
一个存放所拖放文件名称的数据结构的句柄, 也就是文件名缓冲区的句柄,需要从Windows消
息WM_DROPFILES中获得.iFile指明所要查询 文件的序号,它有两种取值方式,1.值为十六进制
数FFFFFFFF时,DragQueryFile的返回值为 所拖放文件的数目;2.值在0到拖放文件总数之间时,
DragQueryFile函数将相应序号的文件 名放入参数lpszFile所指向的缓冲区内,若此时lpszFile
的值为NULL,则DragQueryFile会返 回相应文件名的长度.参数cch决定缓冲区的长度,
由于Windows95支持长文件名,它的值不能 设得太小.

VOID DragFinish(

    HDROP hDrop  // handle to memory to free
   );
使用DragFinish函数告诉Windows拖放操作结束,使 其释放文件名缓冲区,它的参数hDrop与DragQueryFiles函数中的一样,也由Windows消息WM_DROPFILES 的hDrop参数获得.
}
procedure TForm1.Button1Click(Sender: TObject);
var TheIcon: TIcon;
begin
    OpenDialog1.Execute;
    edit1.Text:= OpenDialog1.FileName;
    TheIcon := TIcon.Create;    //创建TIcon实例
    TheIcon.Handle := ExtractIcon(hInstance,Pchar(edit1.Text),0);

    if TheIcon.Handle <> 0 then   //取得图标
      begin
        Button2.Enabled:= True;
        Edit2.Text:= '输入要保存的文件名';
        Panel1.Caption:= '';
        N1.Enabled:= True;        //激活右键
        TheIcon.SaveToFile('temp.cur');     //光标变成取得的图标
        screen.Cursors[1000]:= loadcursorfromfile('temp.cur');  //光标写进screen变量里
        deletefile('temp.cur');   //删除temp文件
        image1.Cursor:= 1000;
      end
    else
      begin
        Button2.Enabled:= False;
        Panel1.Caption:= '空';
        N1.Enabled:= False;
        image1.Cursor:=crDefault;
      end;
    image1.Picture.Icon:= TheIcon;
    Form1.Icon:= TheIcon;
    TheIcon.Free;    //释放内存
end;

procedure TForm1.Button2Click(Sender: TObject);
var TheIcon: TIcon;
begin
    SaveDialog1.FileName:= Trim(Edit2.Text);
    if SaveDialog1.Execute() then
      begin
      TheIcon := TIcon.Create;
      TheIcon.Handle := ExtractIcon(hInstance,Pchar(edit1.Text),0);
      if TheIcon.Handle <> 0 then
        begin
          TheIcon.SaveToFile(SaveDialog1.FileName+'.ico');
          ShowMessage('成功保存: '+SaveDialog1.FileName+'.ico');
        end
      else
        begin
          Button2.Enabled:= False;
          N1.Enabled:= False;
        end;
      TheIcon.Free;
      end;
end;

procedure TForm1.Edit2Click(Sender: TObject);
begin
    if Edit2.Text='输入要保存的文件名' then
      Edit2.Text:= '';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Application.Title:= Form1.Caption;
    DragAcceptFiles(Handle,True); // 让窗口接受拖放
end;

procedure TForm1.N1Click(Sender: TObject);
begin
    Button2.Click;
end;

procedure TForm1.WMDROPFILES(var Message: TWMDROPFILES);
var NumFiles: longint;
    i: longint;
    buffer: array[0..255] of char;
    TheIcon: TIcon;
begin
    {How many files are being dropped}
    NumFiles := DragQueryFile(Message.Drop,$FFFFFFFF,nil,0); //获得拖放的文件数量
    {Accept the dropped files}
    for i := 0 to (NumFiles - 1) do //输出
      begin
        DragQueryFile(Message.Drop,i,@buffer,sizeof(buffer));
        //开始要做的处理
        edit1.Text:= buffer;
        TheIcon := TIcon.Create;
        TheIcon.Handle := ExtractIcon(hInstance,Pchar(edit1.Text),0);
        if TheIcon.Handle <> 0 then   //取得图标
          begin
          Button2.Enabled:= True;
          Edit2.Text:= '输入要保存的文件名';
          Panel1.Caption:= '';
          N1.Enabled:= True;        //激活右键
          TheIcon.SaveToFile('temp.cur');     //光标变成取得的图标
          screen.Cursors[1000]:= loadcursorfromfile('temp.cur');  //光标写进screen变量里
          deletefile('temp.cur');   //删除temp文件
          image1.Cursor:= 1000;
          end
        else
          begin
          Button2.Enabled:= False;
          Panel1.Caption:= '空';
          N1.Enabled:= False;
          image1.Cursor:=crDefault;
          end;
        image1.Picture.Icon:= TheIcon;
        Form1.Icon:= TheIcon;
        TheIcon.Free;
      end;
    DragFinish(Message.Drop);
end;

end.

delphi 2007 + xp sp2下运行通过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值