易语言教程_易语言源码_易语言写挂_易语言论坛_看流星社区

 找回密码
 注册
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 1032|回复: 0

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.
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2018-8-21 10:49 易语言论坛 易语言导航

Powered by 看流星社区 X3.2

©2011-2016 最好的辅助编程技术论坛

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