修改程序exe图标(0分)

  • 主题发起人 主题发起人 ChJK
  • 开始时间 开始时间
C

ChJK

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我稍微修改的修改程序图标的代码,惟一不足就是修改后的图标是256色,想请各位高手帮忙解决一下
const
readlen=10; //每次读取字节数,可改变
icolen=766;
var
i: Integer;
Large, Small: HICON;
nIcons: Integer;
j,itemp,nPos:int64;// nPos为目的图标在目的文件的位置
ci,cj:array[0..readlen-1] of char;
SourceFile,DestFile:String;
bOK:boolean;
SourceIcon,DestIcon:TIcon;
SIconStream,s,sDest:TMemoryStream;
begin
if OpenDialog1.Execute then
begin
self.Image1.Canvas.Refresh;
nIcons:=ExtractIconEx(PChar(OpenDialog1.FileName), -1, Large, Small, 1);
for i:=0 to nIcons-1 do
begin
ExtractIconEx(PChar(self.OpenDialog1.FileName), i, Large, Small, 1);
{提取源程序图标}
DrawIcon(self.Image1.Canvas.Handle,(i div 4)*40,(i mod 4)*40,Large);
{将所有图标显示在Image1里}
end;
SourceIcon:=TIcon.Create;
SourceIcon.Handle := Large;
DestIcon:=TIcon.Create;
if OpenDialog2.Execute then
DestFile:=OpenDialog2.FileName
else
exit;
DestIcon.Handle:=ExtractIcon(handle,PChar(DestFile),0);
{提取目标程序图标句柄}
SIconStream:=TMemoryStream.Create;
DestIcon.SaveToStream(sIconStream);
if sIconStream.size<>icolen then
ShowMessage('SIcon.size<>icolen');
SDest:=TMemoryStream.Create;
sDest.LoadFromFile(DestFile);
i:=0;j:=0; //以下程序查找目的图标在目的程序中的位置
while i< sDest.size do
begin
itemp:=i;
j:=126;
ci:='';cj:='';
while (String(ci)=String(cj)) and (i<SDest.size) and (j<icolen) do
begin
i:=i+readlen;
j:=j+readlen;
SDest.Position:=i;
SDest.read(ci,readlen);
SiconStream.Position:=j;
SiconStream.Read(cj,readlen);
end;
if j<icolen then
i:=itemp+1 //没找到
else
begin
nPos:=itemp; //找到
bOK:=true;
break;
end;
end;
if bOK=false then
exit;//目标文件二进制码中未找到图标
SIconStream.Clear;//将源程序图标存入
SourceIcon.SaveToStream(SIconStream);

SIconStream.position:=126;
s:=TMemoryStream.Create;

sDest.Position:=0;
s.CopyFrom(sDest,nPos);//将目的程序图标前数据拷入
s.CopyFrom(SIconStream,640); //将源程序图标拷入
if sDest.size>sDest.Position+640 then //将目的程序剩余数据拷入
begin
sDest.Position:=sDest.Position+640;
s.CopyFrom(sDest,sDest.Size-sDest.Position);
end;
s.SaveToFile(Extractfilepath(application.exename)+'Result.exe');
SourceIcon.Free;DestIcon.Free; //改造好的程序存放在本目录Result.exe文件中
SIconStream.Free;s.Free;sDest.Free;
ShowMessage(Extractfilepath(application.exename)+'Result.exe');
end;
 
mark 一下,有空研究一下.
 
后退
顶部