【问题标题】:How to change the icon of an external EXE file using Delphi?如何使用 Delphi 更改外部 EXE 文件的图标?
【发布时间】:2020-08-01 09:09:48
【问题描述】:

我想使用 Delphi 更改以前生成的 EXE 文件的主图标。 EXE 文件也是我使用 Delphi 生成的。但我希望用户能够更改其图标。

我尝试使用 UpdateResource 函数更改 RT_GROUP_ICON 和 RT_ICON,但没有成功:

procedure UpdateExeIcon(Const IconFilename, ExternalExeFilename:string);
var
  Stream     : TFileStream;
  hDestRes   : THANDLE;
  lpData     : Pointer;
  cbData     : DWORD;
begin
  Stream := TFileStream.Create(IconFilename,fmOpenRead or fmShareDenyNone);
  try
    Stream.Seek(0, soFromBeginning);
    cbData:=Stream.Size;
    if cbData>0 then
    begin
      GetMem(lpData,cbData);
      try
        Stream.Read(lpData^, cbData);
        hDestRes:= BeginUpdateResource(PChar(ExternalExeFilename), False);
        if hDestRes <> 0 then
        begin
          //if UpdateResource(hDestRes, RT_ICON,PChar('1'),1033,lpData,cbData) then
          if UpdateResource(hDestRes, RT_GROUP_ICON,PChar('MAINICON'),1033,lpData,cbData) then
          begin
            if not EndUpdateResource(hDestRes,FALSE) then RaiseLastOSError;
          end else RaiseLastOSError;
        end else RaiseLastOSError;
      finally
        FreeMem(lpData);
      end;
    end;
  finally
    Stream.Free;
  end;
end;

【问题讨论】:

  • 您何时/在何处得出“没有成功”的结论?还有哪些步骤是成功的?
  • @AmigoJack 该程序确实注入了一些东西,但它并没有改变主图标。
  • Windows 角度的主图标是第一个。使用资源编辑器检查可执行文件以查看发生了什么。与往常一样,解决问题的关键是调试它。
  • 刷新图标缓存有用吗? superuser.com/questions/499078/…
  • @W.Chang 不,它不起作用。甚至尝试更改文件名。

标签: delphi delphi-10.3-rio


【解决方案1】:

有多个错误:

  1. UpdateResource(hDestRes, RT_ICON,PChar('1'),1033,lpData,cbData) 中,lpName 参数以两种方式起作用:PChar('1') 将变成文本,而MakeIntResource(1) 将变成数字。您需要后一种变体,而不是前者。
  2. 对于资源类型RT_ICON,您必须提供实际的图标有效负载,而不是整个图标文件。现在你做的是后者,而不是前者。看看图标文件的样子,然后看看资源只有什么。
  3. 资源类型RT_GROUP_ICON 是“仅”一个描述现有RT_ICON 资源的索引,应根据更新后的图标进行修补(除非宽度、高度、颜色、像素深度和有效负载长度都相同)。在这里填写文件内容毫无意义。

您在上方看到Resource Hacker 显示我们要更新的资源的原始字节。 128 是十六进制字节的长度。

在上面你看到HxD 显示了一个完整的图标文件 - 我选择了第一个图标 payload 所在的部分:从偏移量26 开始,长度为128(均为十六进制)。两个字节序列匹配。

如果你做了所有这些(在RT_ICON 上使用MakeIntResource(1) 并且只提供图标文件的图片数据)那么你很好 - 它对我来说很好:我的 EXE 然后在 Windows 中显示了新图标Explorer(尚未执行)。更新RT_GROUP_ICON 也应该完成,因为我不确定它在哪里似乎没有效果,什么时候突然变成一个问题。在十六进制编辑器中查看您的文件并在资源编辑器中查看您的 EXE 将使您更好地理解所有操作。延伸阅读:

【讨论】:

  • 感谢您的大力帮助。您能否提供#2 的代码示例?我不知道如何提供有效负载而不是图标文件。
  • 我不能,因为我不知道您要读取文件中的哪个图标。此外,“如何解析图标文件”应该是一个新问题,而不是评论。
  • 假设我只使用 32x32 像素 32 位深度的图标文件(没有多图标)。非常感谢您提供示例有效负载代码。
  • 提出一个新问题,说明你目前取得的成就和失败的地方 - 只有优势,而不是像聊天一样对待 cmets。
  • 6 个赞,但 @Andrzej 不会接受 - 这个问题毕竟是借用代码和委托作业的组合吗?
猜你喜欢
  • 2019-12-23
  • 2017-03-15
  • 1970-01-01
  • 2014-07-21
  • 2017-07-18
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多