Delphi替换PE图标资源

    技术2022-05-20  55

    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 .

    最新回复(0)