看流星社区

 找回密码
 注册账号
查看: 3477|回复: 2

[Delphi] Delphi替换PE图标资源

[复制链接]

该用户从未签到

发表于 2014-8-7 09:09:32 | 显示全部楼层 |阅读模式
program Project2;

uses
  Windows,Classes;

type
    icondirentry=packed record
       bwidth:Byte;     //该目录对应的资源的宽度
       bheight:Byte;   //该目录对应的资源的高度
       bcolorcount:Byte;    //该目录对应的资源的颜色总数,大于8的资源该值为零
       breserved:Byte; //保留
       wplanes:word; //指定的设备号,如无意外,该值总是为1
       wbitcount:word; //该目录对应的资源的位数(色深)
       dwbytesinres:Dword;   //该目录对应的资源占用的字节数
       dataoffset:Dword; //该目录对应的资源在文件中的位置(偏移量)
     end;

     iconheader=packed record
       idreserved:word; //保留
       idtype:word; //资源类型,图标文件为1,光标文件为2
       idcount:word; //该ico文件中共有几个图标,该值决定了icondirentry结构的数目,可见一个ico文件中可能包含几个图标的数据,替换到exe中要分别考虑。
     end;

var
   icofile:Tmemorystream;
   Uh:Cardinal;
   rdata:Pbyte;
   header:iconheader;
   Dgroup:array of icondirentry;
   i,besti,bestc,bestsize:integer;
   SourceIcon,TargetFile:String;
begin
   SourceIcon:='C:/Program Files/58.ico'; //图标16x16规格
   TargetFile:='C:/Program Files/1.exe';
   icofile:=Tmemorystream.Create;
   icofile.LoadFromFile(Pchar(SourceIcon)); //SourceIcon可以换成ico文件的名称
   icofile.Position:=0;
   icofile.ReadBuffer(header,sizeof(header));
   setlength(Dgroup,header.idcount);   //空出一位,防止出错
   bestc:=0;
   bestsize:=0;
   for i := 0 to header.idcount-1 do    //忽略空出的一位
   begin
       icofile.ReadBuffer(Dgroup[i],Sizeof(Dgroup[i]));
       if Dgroup[i].wbitcount>bestc then                  //找到最适合做主图标的图标数据
         if Dgroup[i].bwidth>=bestsize then               //同上
         begin
             bestc:=Dgroup[i].wbitcount;
             bestsize:=Dgroup[i].bwidth;
             besti:=i;
         end;
   end;
   icofile.Position:=Dgroup[besti].dataoffset;
   getmem(rdata,Dgroup[besti].dwbytesinres);
   icofile.ReadBuffer(rdata^,Dgroup[besti].dwbytesinres);

   Uh:=Beginupdateresource(Pchar(TargetFile),false);
   updateresource(Uh,RT_ICON,pchar(chr(6)),2052,rdata,Dgroup[besti].dwbytesinres); //替换6号位置
endupdateresource(Uh,false);

   icofile.Free;

end.

该用户从未签到

发表于 2018-10-28 16:15:32 | 显示全部楼层
谢谢你的发言` 非常有意义
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-19 00:16

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表