怎样用程序更改某个已经编译好的可执行文件的图标?----不是要exescope这类工具,而是自己用程序修改。(50分)

  • 主题发起人 主题发起人 stanely
  • 开始时间 开始时间
S

stanely

Unregistered / Unconfirmed
GUEST, unregistred user!
以下代码有些问题:
1。当新图标颜色深度比较大的时候,更改过后将变得几乎无法识别原来的样子,但是被更改的*.exe程序没有错误.

2。我在win2000下编译的,但是在win98下找不到目标exe的图标。


以下是源程序,请帮我,谢谢!

////////////////////////
function ChangeAppIcon(AppFile,IconFile:string;Index:integer=0):boolean;
var
ms,newicn:tmemorystream;
oldicn,appss,appicnss:tstringstream;
appicn:ticon;
i,j,icnlen,icnfsize,icnhdlen:integer;
icnhd:hicon;
fs,icnfs:tfilestream;
//icnfh:cardinal;
//s:string;
begin
result:=false;
icnhdlen:=126;
if (not fileexists(appfile)) or (not fileexists(iconfile)) then exit;
try

//msg(iconfile);
fs:=tfilestream.Create(appfile,fmopenreadwrite+fmsharedenywrite);
appss:=tstringstream.Create('');
appss.Position:=0;
fs.Position:=0;
appss.CopyFrom(fs,0);
//////////
appicn:=ticon.Create;
icnhd:=extracticon(application.Handle,pchar(appfile),index);
if icnhd<=1 then
begin
raise exception.Create('No such an icon index '+inttostr(index)+' in file: "'+appfile+' ".');
end;
appicn.Handle:=icnhd;
appicnss:=tstringstream.Create('');
appicn.SaveToStream(appicnss);
appicn.Free;
appicn:=nil;
icnlen:=appicnss.Size-icnhdlen;
//////////
appicnss.Position:=icnhdlen;

oldicn:=tstringstream.Create('');
oldicn.Position:=0;
appicnss.Position:=icnhdlen;
oldicn.CopyFrom(appicnss,icnlen);
appicnss.Free;
//////////
i:=pos(oldicn.DataString,appss.DataString);
appss.Free;
appss:=nil;
oldicn.Free;
///////////
icnfs:=tfilestream.Create(iconfile,fmopenread+fmsharedenynone);
newicn:=tmemorystream.Create;
icnfs.Position:=icnhdlen;
newicn.Position:=0;
newicn.CopyFrom(icnfs,icnfs.Size-icnhdlen);
icnfs.Free;
// msg2(newicn.Size);
/////////////////
if i<=0 then
begin
raise exception.Create('Cannot find icon data in file: "'+appfile+' ".');
end;
// msg2(i);
if icnlen<>newicn.Size then
begin
//raise exception.Create('The size of the icon file: "'+iconfile+'" is not the same with the application''s icon.');
ms:=tmemorystream.Create;
fs.Position:=i+icnlen-1;
ms.Position:=0;
ms.CopyFrom(fs,fs.Size-fs.Position);
fs.Position:=i-1;
newicn.Position:=0;
fs.CopyFrom(newicn,0);
ms.Position:=0;
fs.CopyFrom(ms,0);
fs.Position:=0;
fs.Size:=i+icnlen-1+ms.Size;
ms.Free;
end
else
begin
fs.Position:=i-1;
//fs.Write(newicn,icnlen);
newicn.Position:=0;
fs.CopyFrom(newicn,0);
end;
msg2(icnlen);
msg2(newicn.Size);
newicn.Free;
/////////////////
result:=true;
finally
fs.Free;

{ freeandnil(appss);
freeandnil(appicn);
freeandnil(appicnss); }
end;
end;
////////////////////////////////////


 
没人知道?
 
1:注意extracticon这句啊.它释放的是特定颜色的.
2:可能你的EXE太大了,全部存到STRINGLIST里面,肯定包错啊.
 
1.如果包含特定颜色,那么是不是说永远没有办法得到颜色深度大的icon了?

2.我测试用的exe没有超过1M的,我的内存够用,没有包错。
 
后退
顶部