我正在尝试编写一个unix命令行实用程序,它将从Windows Mobile可执行文件中提取“应用程序”图标。当我从icoutils包中查看带有wrestool的.exe时,我看到多个icon和group_icon资源。我试图弄清楚Windows Mobile程序视图会选择向最终用户显示哪个图标。
起初,我认为它将是名称为32512(IDI_APPLICATION)的图标,但后来我发现了几个缺少此图标资源的Windows Mobile二进制文件,但确实在程序视图中有可见图标。
是否有简单但正确的算法?喜欢最低资源ID? .exe中是否有另一个资源告诉我什么是应用程序图标?有什么明显的东西我不见了吗?
任何见解都将受到赞赏。
答案 0 :(得分:1)
这是可执行文件中的第一个RT_GROUP_ICON
资源。
答案 1 :(得分:1)
让我们按步骤展示。首先,您需要查看EXE中的内容:
wrestool -l file.exe
通常,它是第一个GROUP_ICON的最佳图标,但是当GROUP_ICONs名称是单词而不是数字时,则是具有最大尺寸的GROUP_ICON(如果第一个GROUP_ICON为空白,则为第二大尺寸,您将需要提取两者)。
wrestool -x -t14 -n(GROUP_ICON name) file.exe > file.ico
如果你想创建一个完美的代码,你可能也应该包含GROUP_ICON语言(有时exe不会有语言(16位应用程序),所以你需要把两个代码都放在一起): / p>
wrestool -x -t14 -n(GROUP_ICON name) -l(GROUP_ICON language) file.exe > file.ico
在某些应用中,GROUP_ICON提取将失败。这是因为一些新的应用程序(如新游戏)正在使用GROUP_ICON作为链接,并在ICON中插入真实的图标。然后,您需要使用该代码提取最大的ICON:
wrestool -x -R -t3 -n(ICON name) -o. file.exe > file.ico
但是会有一个很大的问题。这将提取ICON,但文件的一小部分将丢失,这对于以.ico打开此文件至关重要。您需要在十六进制编辑器中打开该文件,并在文件中插入一些小的十六进制代码。
00 00 01 00 01 00 80 80 00 00 01 00 18 00 28 C8 00 00 16 00 00 00
可能,现在你认为这是结束。没有。更糟糕的部分即将到来:从ICO中提取正确的图片。首先,你不仅需要wrestool,还需要icotool。然后,使用该代码:
icotool -l file.ico
然后,您需要提取具有最大宽度,高度和位深度的文件。
icotool -x -o. -w(Width) -h(Height) -b(Bit-depth) file.ico
结果将是一个带有完美图标的PNG文件。有时,该代码可能会失败(例如:程序“Robust Motion Deblurring”),那么您将需要第二个转换器从ICO更改为PNG,但在某些情况下该转换可能会失败(例如:游戏“质量效应”) ,所以你可能在你的代码中都需要这两个。
我曾在Objective-C程序中使用过一次这样的逻辑,所以我知道它的功能(直到现在,99.9%的成功)。