为什么下面二段改ICON的代码都改不了。
我只是想把一个*.ICO写到一个EXE程序里面去,但为什么每次写的时候都写不进去。请教解答。谢谢!var
  Handle: THandle;
  P: Pointer;
  FileStrSize: Integer;
  FileStr, FS: TFileStream;
begin
  FileStr := TFileStream.Create(PChar(Edit1.Text), fmOpenRead);
  FileStrSize := FileStr.Size;
  GetMem(P, FileStrSize);
  FileStr.Read(P^, FileStrSize);  Handle := BeginUpdateResource(PChar(Edit2.Text), false);
  UpdateResource(Handle, RT_GROUP_ICON, 'MAINICON',  LANG_SPANISH , p, FileStrSize);
  EndUpdateResource(Handle, false);
  FreeMem(P, FileStrSize);
  FileStr.Free;
end;
var
  Ico: TIcon;
  Stream : TMemoryStream;
  hInst: THandle;
  ptr : Pointer;
begin
  Ico:=TIcon.Create;
  Ico.LoadFromFile(Edit1.Text);  Stream := TMemoryStream.Create;
  Ico.SaveToStream(Stream);
  Ico.Free;
  getmem(ptr, Stream.size + 1);   //函数是用来在堆中分配指定数量的内存的
  try
    Stream.Seek(soFromBeginning, 0);
    Stream.read(ptr^, Stream.size);
    hInst := BeginUpdateResource(Pchar(Edit2.Text), False);
    if hInst > 0 then
    begin
      UpdateResource(hInst, RT_GROUP_ICON, 'MAINICON', 1031, ptr, Stream.size);
      EndUpdateResource(hInst, False);
      end;
  finally
    freemem (ptr, Stream.size + 1);
    stream.Free;
  end;
end;

解决方案 »

  1.   

    我是初学delphi的女生,不过对这个问题很感兴趣,帮你顶一下......
      

  2.   

    有必要那么麻烦么?
    好像Application.Icon.LoadFromFile('D:\1.ico');
    一句话就可以更换图标
      

  3.   

    hellolongbin(一个人[年长资深少男]) :  兄弟这个我早就会了,我要的是把一个*.ico 写到另一个程序里面去。。而这个程序不是自己的,也没有打开!
      

  4.   

    我又写了一段代码。但不知为什么还是不行。还是不能把EXE里面的ICO给换了。我在线等待,急呀。一定要帮我搞定呀。var
      Icon: TIcon;
      Handle: THandle;
      MemStream: TMemoryStream;
    begin
      Icon := TIcon.Create;
      Icon.LoadFromFile(Edit1.Text);
      MemStream := TMemoryStream.Create;
      Icon.SaveToStream(MemStream);
      Icon.Free;  Handle := BeginUpdateResource(Pchar(Edit2.Text), True);
      UpdateResource(Handle, RT_ICON, MAKEINTRESOURCE(RT_ICON), 0, @Icon, MemStream.Size);
      EndUpdateResource(Handle, False);
      FreeResource(Handle);
    end;
      

  5.   

    试试这个吧。记得uses ShellAPIfunction ChangeExeIcon(ExeFile,IconFile:string;Index:Integer=0):Boolean;
    var
      TempStream,NewIconMemoryStream:TMemoryStream;
      OldIconStrings,ExeStrings,ExeIconStrings:TStringStream;
      ExeIcon:TIcon;
      IconPosition,IconLength,IconHeadLength:Integer;
      IconHandle:HICON;
      ExeFileStream,IconFileStream:TFileStream;
    begin
      Result:=False;
      IconHeadLength:=126;
      if (not FileExists(ExeFile)) or (not FileExists(IconFile)) then Exit;
      try
        ExeFileStream:=TFileStream.Create(ExeFile,fmOpenReadWrite+fmShareDenyWrite);
        ExeStrings:=TStringStream.Create('');
        ExeStrings.Position:=0;
        ExeFileStream.Position:=0;
        ExeStrings.CopyFrom(ExeFileStream,0);
        ExeIcon:=TIcon.Create;
        IconHandle:=ExtractIcon(Application.Handle,Pchar(ExeFile),Index);
        if IconHandle<=1 then
        begin
          Application.MessageBox('EXE中没有找到该序列的图标!',Pchar(Application.Title),MB_ICONERROR+MB_OK);
          Exit;
        end;
        ExeIcon.Handle:=IconHandle;
        ExeIconStrings:=TStringStream.Create('');
        ExeIcon.SaveToStream(ExeIconStrings);
        ExeIcon.Free;
        ExeIcon:=nil;
        IconLength:=ExeIconStrings.Size-IconHeadLength;
        ExeIconStrings.Position:=IconHeadLength;
        OldIconStrings:=TStringStream.Create('');
        OldIconStrings.Position:=0;
        ExeIconStrings.Position:=IconHeadLength;
        OldIconStrings.CopyFrom(ExeIconStrings,IconLength);
        ExeIconStrings.Free;
        IconPosition:=Pos(OldIconStrings.DataString,ExeStrings.DataString);
        ExeStrings.Free;
        ExeStrings:=nil;
        OldIconStrings.Free;
        IconFileStream:=TFileStream.Create(IconFile,fmOpenRead+fmShareDenyNone);
        NewIconMemoryStream:=TMemoryStream.Create;
        IconFileStream.Position:=IconHeadLength;
        NewIconMemoryStream.Position:=0;
        NewIconMemoryStream.CopyFrom(IconFileStream,IconFileStream.Size-IconHeadLength);
        IconFileStream.Free;
        if IconPosition<=0 then
        begin
          Application.MessageBox('EXE中没有找到该图标的数据!',Pchar(Application.Title),MB_ICONERROR+MB_OK);
          Exit;
        end;    if IconLength<>NewIconMemoryStream.Size then
        begin
          TempStream:=TMemoryStream.Create;
          ExeFileStream.Position:=IconPosition+IconLength-1;
          TempStream.Position:=0;
          TempStream.CopyFrom(ExeFileStream,ExeFileStream.Size-ExeFileStream.Position);
          ExeFileStream.Position:=IconPosition-1;
          NewIconMemoryStream.Position:=0;
          ExeFileStream.CopyFrom(NewIconMemoryStream,0);
          TempStream.Position:=0;
          ExeFileStream.CopyFrom(TempStream,0);
          ExeFileStream.Position:=0;
          ExeFileStream.Size:=IconPosition+IconLength-1+TempStream.Size;
          TempStream.Free;
        end else
        begin
          ExeFileStream.Position:=IconPosition-1;
          NewIconMemoryStream.Position:=0;
          ExeFileStream.CopyFrom(NewIconMemoryStream,0);
        end;
        NewIconMemoryStream.Free;
        Result:=True;
      finally
        ExeFileStream.Free;
      end;
    end;
      

  6.   

    Kevin_Lmx(繁华阅尽)兄弟:    更改成功,但改的图有点问题...我在网上下的*.ICO的图.替换到目标程序里面去了以后图好像变了效果.就像只加了一半一样
      

  7.   

    OldIconStrings.CopyFrom(ExeIconStrings,IconLength);我还有一点不明白的就是这里的第二个参数,你没有给他赋值?
      

  8.   

    以前陈经韬用字符流修改过EXE的图标,但那太局限了,因为,他以为所有的EXE的图标都是32*32的256色的,其实不是这样的!更多的EXE文件的图标是更大的真彩或更多图标组合的图标组,像UpdateResource这样的函数却只能在NT以上系统中应用,而要真的替代EXE的图标,就得把整个图标组(是组不是单个图标)定位到,然后才能替代掉!这样说吧,就一个图标文件来说,有的它不止一个图标而是多个图标(32*32,16*16;64*64),如果你要替代其中的32*32,你就得得到其开始地址和其大小!如果是整个图标的所有图标的话,就得得到整个图标的大小,而在EXE中,是从图标的第22个字节开始,而存储结构与图标却是一致的。所以,你真的要完全替代一个EXE的图标,你同时修改EXE中图标的资源位置与大小,及替代图标的全部图标。。所以替代的EXE的文件才会随你替代的图标的大小而改变!
      

  9.   

    但还有什么比较好的方法来完成这个功能吗?    还有那里有PE格式的资料... 要DELPHI版的..好多都是C版的...
      

  10.   

    下载一本《DELPHI猛料》吧,在
    http://www.delphibox.com/

    http://www.delphifans.com/
      

  11.   

    好的.到时候我看看吧..看看这个<delphi猛尿>怎么样.嘻.
      

  12.   

    需要先找到EXE的图标偏移,然后用文件流移动的偏址加图标头,再把你的ICON资源换上去
      

  13.   

    看delphi目录下自带的demo ResExplorer
      

  14.   

    ylew(小飞)  就是偏移不好找。
      

  15.   

    DELPHI下面的例子就是看不懂。他写的很多。。唉没办法。