【问题标题】:In resources of a executable file, how does one find the default icon?在可执行文件的资源中,如何找到默认图标?
【发布时间】:2010-07-17 08:21:11
【问题描述】:

我需要以编程方式查找 Windows 可执行文件(PE 文件 = dll、exe、com..)的默认图标。我确实知道如何浏览资源并确定什么是图标、什么是光标等,但据我所知,没有任何图标以任何方式标记为默认图标。那么,有人知道如何找到默认图标吗?此外,我不想使用任何 Windows api 调用,我想自己编写函数。问题是我不知道所有图标中的哪一个是默认图标。

【问题讨论】:

    标签: c++ windows resources icons portable-executable


    【解决方案1】:

    经过大量搜索,我发现默认图标不是id最低的那个。

    Windows 使用不同尺寸的一个图标来处理各种事情。更多信息,look here,但总之这里是重要信息:


    当系统显示一个图标时,它必须从 .exe 或 .dll 文件中提取适当的图标图像。系统使用以下步骤选择图标图像:

    1. 选择 RT_GROUP_ICON 资源。 如果不止一种这样的资源 存在,系统使用第一个 资源中列出的资源 脚本。

      • 选择适当的 RT_ICON 图像 来自 RT_GROUP_ICON 资源。如果 存在不止一个图像,则 系统使用以下标准 选择图像:

      • 尺寸最接近 选择了要求的尺寸。

      • 如果两个或多个该尺寸的图像 存在,匹配的那个 选择显示的颜色深度。

      • 如果没有图像与颜色完全匹配 显示深度,图像与 最大的颜色深度 不超过颜色深度 选择显示。如果全部超过 颜色深度最低的那个 选择颜色深度。

    注意:系统将所有 8 或更高 bpp 的颜色深度视为相同。因此,在同一资源中包含 16x16 256 色图像和 16x16 16 色图像没有任何优势——系统只会选择它遇到的第一个。当显示为 8-bpp 模式时,系统将选择 16 色图标而不是 256 色图标,并使用系统默认调色板显示所有图标。


    由于请求的大小是 16x16(因为这是系统小图标大小,即默认图标大小),我想我们可以说 默认图标是第一个图标组中具有最小大小的图标(不能存在小于 16x16 的图标)具有最高颜色深度。

    编辑:一个小的修正。小于 16x16 的图标显然可能在资源中,但这表明该文件没有默认图标,然后系统会提供自己的图标。

    【讨论】:

      【解决方案2】:

      你找到的第一个是默认的。

      默认图标就是 ID 最小的图标,因此,根据定义,它是枚举资源时发现的第一个图标。

      【讨论】:

      • 你能告诉我你在哪里找到这些信息吗?我试图用谷歌搜索,但没有发现任何相关内容。
      • +1,这是正确的。你可以在这里找到它:stackoverflow.com/questions/3270757/…
      • 显然你在同一个地方。当然,我将“ICON_GROUP”解释为“图标”,因为图标组是源图标(ico 文件)中各个设备图像的集合。因此,我坚持我的主张 - 找到的第一个图标是默认图标。这往往是 id 最低的那个,因为大多数资源编辑器会首先构建低 id 的资源文件。
      • 从技术上讲你是正确的,不幸的是,假设具有最低 id 的图标将是默认图标对我来说还不够好(原因,请看这里:microsoft.com/technet/security/bulletin/ms05-002.mspx)。无论如何感谢您的回答!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多