着眼于从 EXE 文件中提取图标(ICO 文件)的所有大小作为 PNG 图像,我注意到 Wine 似乎会自动执行此操作。
安装foobar2000后,Wine(我想)在 处创建了一个桌面条目~/.local/share/applications/wine/Programs/foobar2000.desktop
,包含以下内容:
[Desktop Entry]
Name=foobar2000
Exec=env WINEPREFIX="$HOME/.wine" wine C:\\\\windows\\\\command\\\\start.exe /Unix "$HOME/.wine/dosdevices/c:/users/Public/Start\\ Menu/Programs/foobar2000.lnk"
Type=Application
StartupNotify=true
Comment=Play, organize and tag your music.
Path=$HOME/.wine/dosdevices/c:/Program Files (x86)/foobar2000
Icon=3C17_foobar2000.0
最终,Icon
密钥引起了我的注意,我发现它根据Icon Theme Specification解决了。到处寻找,我找到了~/local/share/icons/hicolor/*/apps/
包含这些图标文件的目录(每个文件夹都包含3C17_foobar2000.0.png
),我再次假设是 Wine 创建的。
我的问题是 Wine 是如何从应用程序(或快捷方式文件)生成这些图像文件的?
Wine 包含一个
winemenubuilder
处理此问题的程序:它采用 Windows 快捷方式,并创建一个匹配的 FDO (FreeDesktop.Org).desktop
文件。图标提取是其中的一部分,由open_module_icon
相关函数处理。提取图标,winemenubuilder
找到与快捷方式对应的可执行文件(如果需要,可以选择等待它被创建),并使用 Wine 的LoadResource
函数加载它包含的资源,找到图标,并将它们转换为适当的图像格式。会将链接转换为
.desktop
文件,在 中~/.local/share/applications/wine/Programs
,提取可用图标,转换它们,并将它们存储在 的适当子目录中~/.local/share/icons
。(我认为/path/to/link.lnk
必须可以使用 Wine 的驱动器映射进行访问;它适用.lnk
于已安装在 Wine 中的文件。)link.lnk
将提取to指向的可执行文件中的第一个图标icon.png
。