[问题] 有人知道 Wine 是如何提取 Windows 程序中的图标的吗?

Wine、Cedega、CrossOver 等配置
回复
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

[问题] 有人知道 Wine 是如何提取 Windows 程序中的图标的吗?

#1

帖子 aerofox » 2008-09-03 21:32

如果在网上搜索 “Wine icon”,会得到很多关于如果用 icoutils 或者其它工具提取 Windows 程序图标的链接。
但是我总认为 Wine 本身就可以做到,但不知道它是如果做的。
理由是:
如果有个 Windows 应用程序 App,它提供了一个安装程序 setup.exe。在 Windows 下安装会在桌面生成一个快捷方式,查看快捷方式的属性,可以看到它的图标是 App.exe 或者某个 DLL 库中的一个图标。而如果用 Wine 来运行这个 setup.exe,安装完也会在桌面生成一个 .desktop 文件,它的图标跟 Windows 桌面上的一样,但是是一个独立的图标文件(在~/.local 目录下),说明它是 Wine 提取出来的。
问题是,如果不带安装程序,有什么办法用 Wine 的这一功能把图标提取出来吗?
delectate
帖子: 18311
注册时间: 2008-01-09 22:41

#2

帖子 delectate » 2008-09-04 13:14

:shock:

lz理论依据充分!

但是不知道如何做……

可以尝试读wine源码…………
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

#3

帖子 HuntXu » 2008-09-04 13:21

win的程序,一般有自带ico的和编译到exe中两种,前者转成png就可以用的,后者嘛,用读取资源之类的软件dump出来就是了,crack范畴了...不知道ubuntu下有没有能解析exe资源构成的软件,或者谁给wine个试试 :lol:
HUNT Unfortunately No Talent...
头像
windowssux
帖子: 618
注册时间: 2006-08-06 16:58
来自: 北海

#4

帖子 windowssux » 2008-09-04 14:08

http://ftp.ubuntu.org.cn/home/windowssux/

自己下载wineicons_1.0.6.tar.gz,解压,用Wine运行exe文件就可以了。
在网上搜索wineicons可以找到官网。
头像
想入非非
帖子: 8078
注册时间: 2008-07-14 22:42
来自: Beijing
联系:

#5

帖子 想入非非 » 2008-09-04 17:44

windowssux 写了:http://ftp.ubuntu.org.cn/home/windowssux/

自己下载wineicons_1.0.6.tar.gz,解压,用Wine运行exe文件就可以了。
在网上搜索wineicons可以找到官网。
就是这样弄的
Ubuntu User
leekindo
帖子: 6
注册时间: 2008-01-18 19:13

#6

帖子 leekindo » 2008-09-14 11:04

WINE自动生成的Foobar和Offlinelist的图标快捷方式的脚本如下
从中你可以观察到Icon一项前边的4位16进制应该是一个32位的偏移地址,
估计就是图标在EXE文件的实际地址,
所以获得该地址的话就不用再去提取图标,而可以直接显示

代码: 全选

[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=foobar2000
Exec=env WINEPREFIX="/home/leekindo/.wine" wine "C:\\Program Files\\foobar2000\\foobar2000.exe"
Type=Application
StartupWMClass=Wine
Path=/home/leekindo/.wine/dosdevices/c:/Program Files/Foobar2000
Icon=7498_foobar2000.0
GenericName[zh_CN]=

代码: 全选

[Desktop Entry]
Name=OfflineList
Exec=env WINEPREFIX="/home/leekindo/.wine" wine "C:\\Program Files\\OfflineList\\OfflineList.exe" 
Type=Application
StartupWMClass=Wine
Path=/home/leekindo/.wine/dosdevices/c:/Program Files/OfflineList
Icon=c16d_offlinelist.0
上次由 leekindo 在 2008-09-14 11:20,总共编辑 1 次。
头像
shellex
帖子: 2180
注册时间: 2007-02-18 19:33
系统: OSX
来自: lyric.im
联系:

#7

帖子 shellex » 2008-09-14 11:14

其实图标是作为“资源”放在Windows的可执行文件中。
Windows的exe文件有资源节,M$提供了一套API来进行资源读写。
由于在Windows中对资源操作很频繁,所以Wine对这些API都模拟实现了。
所以Wine只要在Windows编译一个提取图标资源的程序,再自己Wine一下就搞定了(最后一句是我的猜测,如果是我,我会这么干的)。
既然你诚心诚意地问了
我就大慈大悲地告诉你
为了防止世界被破坏
为了维护世界的和平
贯彻爱与真实的罪恶
可爱而又迷人的反派角色
武藏,小次郎
我们是穿越银河的火箭队,白洞白色的明天在等着我们。就是这样!!喵~~
头像
hecha
帖子: 364
注册时间: 2007-09-23 13:36

#8

帖子 hecha » 2008-09-14 12:01

wine 是一个 windows 虚拟机, windows 下提取图标都需要用到工具, wine下当然也需要工具了, 不存在用 wine 直接提取的. 不知道楼主是否这个意思, 想用个脚本提取图标.
lotsunhim
帖子: 16
注册时间: 2008-06-29 5:27

Re: [问题] 有人知道 Wine 是如何提取 Windows 程序中的图标的吗?

#9

帖子 lotsunhim » 2008-09-25 18:30

:em06 我也想知道怎么提取到的!
头像
Nile
帖子: 990
注册时间: 2006-07-15 11:20
来自: 枫叶刀市

Re: [问题] 有人知道 Wine 是如何提取 Windows 程序中的图标的吗?

#10

帖子 Nile » 2008-09-25 18:39

aerofox 写了:如果在网上搜索 “Wine icon”,会得到很多关于如果用 icoutils 或者其它工具提取 Windows 程序图标的链接。
但是我总认为 Wine 本身就可以做到,但不知道它是如果做的。
理由是:
如果有个 Windows 应用程序 App,它提供了一个安装程序 setup.exe。在 Windows 下安装会在桌面生成一个快捷方式,查看快捷方式的属性,可以看到它的图标是 App.exe 或者某个 DLL 库中的一个图标。而如果用 Wine 来运行这个 setup.exe,安装完也会在桌面生成一个 .desktop 文件,它的图标跟 Windows 桌面上的一样,但是是一个独立的图标文件(在~/.local 目录下),说明它是 Wine 提取出来的。
问题是,如果不带安装程序,有什么办法用 Wine 的这一功能把图标提取出来吗?
应该有困难

应该是程序调用了某个系统API完成从资源中提取图表的效果,Wine应该也是从系统dll里调用了这个API,如果单独用的话要考虑如何单独调用这个API,恐怕需要一个单独的程序,这应该不是wine的独立功能。

懂win32编成的请进!
Thinkpad T400
lotsunhim
帖子: 16
注册时间: 2008-06-29 5:27

Re:

#11

帖子 lotsunhim » 2008-09-25 20:45

leekindo 写了:WINE自动生成的Foobar和Offlinelist的图标快捷方式的脚本如下
从中你可以观察到Icon一项前边的4位16进制应该是一个32位的偏移地址,
估计就是图标在EXE文件的实际地址,
所以获得该地址的话就不用再去提取图标,而可以直接显示

代码: 全选

[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=foobar2000
Exec=env WINEPREFIX="/home/leekindo/.wine" wine "C:\\Program Files\\foobar2000\\foobar2000.exe"
Type=Application
StartupWMClass=Wine
Path=/home/leekindo/.wine/dosdevices/c:/Program Files/Foobar2000
Icon=7498_foobar2000.0
GenericName[zh_CN]=

代码: 全选

[Desktop Entry]
Name=OfflineList
Exec=env WINEPREFIX="/home/leekindo/.wine" wine "C:\\Program Files\\OfflineList\\OfflineList.exe" 
Type=Application
StartupWMClass=Wine
Path=/home/leekindo/.wine/dosdevices/c:/Program Files/OfflineList
Icon=c16d_offlinelist.0
不知有什么方法得到该地址呢? :em11
头像
Ur@nus
帖子: 622
注册时间: 2006-12-01 23:02

Re: [问题] 有人知道 Wine 是如何提取 Windows 程序中的图标的吗?

#12

帖子 Ur@nus » 2008-09-25 22:04

看来我的办法太笨了 :em06 ,我如果想提取都是先安装,然后ls -l查看链接的原文件位置再直接cp,我只干过一次,不要被鄙视的体无完肤就好 :em06
chamcham
帖子: 1
注册时间: 2012-03-02 0:14

Re: [问题] 有人知道 Wine 是如何提取 Windows 程序中的图标的吗?

#13

帖子 chamcham » 2012-03-02 0:29

根本不用下载wineicons什么的那么麻烦, 直接用归档管理器(File Roller)打开主程序exe文件(不要吃惊:P), 就可以从ICONS目录里面提取ICO图标文件了。 ICONS目录包含了程序用到的所有图标, 可以先全部提取出来, 在文件管理器里面图标显示一下就可以找到所要的图标了。 还有个小技巧, 桌面启动项右键->属性修改图标时, 文件对话框只能列出PNG的文件, 不管它直接暴力Ctrl-L输入文件名.ICO, 回车搞定 !
FuckTheWorld
帖子: 10
注册时间: 2012-01-14 22:22

Re: [问题] 有人知道 Wine 是如何提取 Windows 程序中的图标的吗?

#14

帖子 FuckTheWorld » 2012-03-02 14:30

wine实现这个功能的代码在program/winemenubuilder/winemenubuilder.c里。
回复