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 .
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 .