100分少了点, 盼高人指点, 谢谢

解决方案 »

  1.   

    add shell you want change icon to what , it is what
      

  2.   

    类似下面这个, 但要求支持真彩色的:procedure TForm1.Button1Click(Sender: TObject);
    const
            readlen=10;  //每次读取字节数,可改变
            icolen=766;//32*32图标长度,根据研究前126为图标头,后640为图标数据
    var
            i,j,itemp,nPos:int64;// nPos为目的图标在目的文件的位置
            ci,cj:array[0..readlen-1] of char;
            SourceFile,DestFile:String;//如果要把记事本图标换成瑞星杀毒软件图标
            bOK:boolean;//则SourceFile='C:\windows\notepad.exe',DestFile:='C:\Progra
    m Files\rising\rav\ravmon.exe'
            SourceIcon,DestIcon:TIcon;
            SIconStream,s,sDest:TMemoryStream;
    begin
            bOK:=false;
            if OpenDialog1.Execute then
                SourceFile:=OpenDialog1.FileName
            else
                exit;
            if  AnsiUpperCase(ExtractFileExt(SourceFile))<>'.EXE' then
            begin
                ShowMessage(AnsiUpperCase(ExtractFileExt(SourceFile)));
                exit;
            end;
            Edit1.Text:=SourceFile;
            if OpenDialog2.Execute then
                DestFile:=OpenDialog2.FileName
            else
                exit;
            if  AnsiUpperCase(ExtractFileExt(DestFile))<>'.EXE' then
                exit;
            Edit2.Text:=DestFile;
            SourceIcon:=TIcon.Create;
            case ExtractIcon(handle,PChar(SourceFile),UINT(-1)) of
                0:begin ShowMessage('源程序没有图标');exit;end;
                1:;
                else ShowMessage('源程序有多个图标,本程序选择第一个图标');
            end;
            SourceIcon.Handle:=ExtractIcon(handle,PChar(SourceFile),0);//选择第一个图

            DestIcon:=TIcon.Create;//选择第N个图标为 ExtractIcon(handle,PChar(Source
    File),N-1)
            case ExtractIcon(handle,PChar(DestFile),UINT(-1)) of
                0:begin ShowMessage('目的程序没有图标');exit;end;
                1:;
                else ShowMessage('目的程序有多个图标,本程序选择第一个图标替换');
            end;
            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;
    {               repeat
                        SDest.Position:=i;
                        sDest.read(ci,Readlen);
                        SiconStream.Position:=j;
                        SIconStream.Read(cj,Readlen);
                        i:=i+Readlen;
                        j:=j+Readlen;
                   until (String(ci)=String(cj)) and (i<sDest.size) and (j<icolen);
    }                       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;
    ------谢谢
      

  3.   

    Application.Icon.LoadFromFile('C:\WINDOWS\Winupd.ico');
      

  4.   

    哦, 不是更改自身的, 是永久性更改别的exe文件的图标, 要求支持真彩色图标, 而不是只能改722字节那种
    100分不够再加
      

  5.   

    我记得我在使用Adobe Illustrator这个软件的时候,所有它自已格式的文件(即AI文件),支持一种缩微图显示,这种缩微图是以图标那么大小来显示的,最高支持32位真彩色,我感得这个缩徽图的图标比起别的软件用起来相当方便,但我不知道这种缩微图是不是“真正”的图标。我感得楼主的要求可能和这个差不多。但我等不会做这种效果。还望高手指点。
      

  6.   

    这几天的研究结果:无解比如当用一个几十k的真彩图标替换原来几k的图标时, 我测试了几个专以这个功能为卖点的专门软件都提示更改后原文件可能无法运行。替换结果确实是无法运行了
    但感觉根据PE结构是应该做的到的: 找到exe文件里纪录图标大小的信息, 更改为新的图标大小; 然后把原图标数据删掉, 替换为新图标流。
    奇怪。  问题无解, 没人接分, 郁闷
      

  7.   

    呵呵
    现在很多工具可以改变exe文件的图标啊,楼主可以去看看!
    我电脑上都有
    如果你要自己去改变的话
    你可以用VS去改变他的资源
    这样程序可以改很多
    呵呵
    连windows自己本身的程序都可以改变
      

  8.   

    很多工具都不是在EXE上做手脚,而是在注册表,或者是文件夹选项上做手脚。