- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
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. |
|