错误的EXE应用程序图标与资源文件

5
我正在研究(.Res)资源文件,并在delphi.about.com网站上找到了一个有用的教程。
教程链接: http://delphi.about.com/od/objectpascalide/l/aa113099a.htm 测试项目下载: http://delphi.about.com/library/aboutres.zip 我发现应用程序图标在Windows资源管理器中显示不同。 应用程序窗体上的图标显示正确(请参阅图像2)。 Windows任务栏上的图标显示正确(请参阅图像3)。
但是,当我浏览它时,Windows资源管理器中的图标是错误的(请参阅图像1)。 它不是来自Res文件的MAINICON。
你有什么想法吗?需要配置什么才能获得.EXE文件的正确应用程序图标?
  • Delphi XE3环境
  • Windows 7环境
  • 您可以从上面的链接下载样本项目
图像编号(1)

EXE Application icon is wrong in Windows Explorer

图片编号(2)

Application icon appears correctly on the task bar

图像编号(3)

Application icon appears correctly on the form

事先感谢。
3个回答

4

如果没有指定要显示的图标,shell会选择ID最小或按字母表顺序排列的第一个图标。在可执行文件中,您有三个图标:ICOFOLD,ICOOK和MAINICON。ICOFOLD是应该显示在shell文件夹中的那个。

任务栏或表单图标是通过发送WM_SETICON消息来设置的,一旦您的程序运行,就不需要猜测了。


感谢@Sertac。如果我从资源文件中删除一个图标(ICOFOLD),似乎会显示字母顺序中的第一个图标,即ICOOK。您知道如何设置以获取正确的图标吗?感谢您的回复。 - sMah
@sMah Sertac已经清楚地解释了。VCL要求您将应用程序图标命名为MAINICON。资源管理器使用它找到的第一个图标。因此,您必须确保第一个图标是您的应用程序图标。 - David Heffernan
2
我通过确保所有其他图标的名称都出现在MAINICON之后来实现这一点。如果您不想这样做,您可以将应用程序图标包含两次。一次作为MAINICON,一次使用ID为1或按字母顺序排在所有其他图标之前的名称。 - David Heffernan
@Sertac 你知道是谁强制执行字母顺序吗?我猜是 Delphi 链接器这么做了,资源管理器只是枚举所有的图标并使用第一个。如果资源管理器找到所有名称并选择第一个会很奇怪。出于性能原因,选择第一个更快。 - David Heffernan
感谢@DavidHeffernan添加注释。我以为有另一种设置MAINICON的方法。现在清楚了,我需要确保MAINICON是第一个。再次感谢。 - sMah
2
@David - 我不知道,实际上我从来没有想过这个问题。你的思路很有道理,但根据我的经验,我不能说资源管理器在这方面真的很快。 - Sertac Akyuz

1
任务栏和窗体窗口中的图标是准确的,因为它们直接来自正在运行的进程资源。另一方面,Windows Explorer会缓存图标,有时缓存会损坏或不同步。这是Windows Explorer的众所周知的问题,与您的应用程序无关。有很多第三方工具可用于修复图标缓存。

嗨@Remy,谢谢你的回复。我之前遇到过那个问题。感谢你提醒我关于图标缓存的事情。我清除了我的图标缓存。但我认为,在我的特定情况下,这不是一个图标缓存问题。还是感谢你的提醒。 - sMah
@sMah,这是一个图标缓存问题,你需要正确地重建它。 - Peter
嗨@Peter,谢谢你的评论。我通过删除C:\ Users \ User \ AppData \ Local \ IconCache.db清除了图标缓存,然后注销并重新登录我的PC。然后我重新编译了它。窗口资源管理器中的图标仍然存在同样的问题。(显示错误的图标) - sMah
@Peter - 根据Windows资源管理器,你认为MAINICON有什么特别之处? - Sertac Akyuz

0

您可以运行以下命令来清除图标缓存:

ie4uinit.exe -ClearIconCache

对于Windows 10,请使用:

ie4uinit.exe -show


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接