LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1671|回复: 9

wine安装windows软件桌面快捷方式图标空白

[复制链接]
发表于 2010-9-17 20:27:21 | 显示全部楼层 |阅读模式
wine-1.3.2装windows软件~/Desktop目录下生成.desktop快捷方式文件,但桌面看到图标为空白,其中Icon字段指向~/.local/share/icons/3550_shell32.0.png,用wine winemenubuilder ~/Desktop/XXXX.lnk转换无效。
Gentoo、Slitaz下wine安装相同程序正常显示桌面图标,图标文件名XXXX_程序名.png,是不是Arch linux下需要装什么依赖包才能正常生成快捷方式图标?
 楼主| 发表于 2010-9-18 21:18:05 | 显示全部楼层
今天又用另一台电脑重装了一次。archlinux-2010.05-netinstall-i686.iso安装盘,手工装lxde、wine以及wine的全部可选依赖包以及另外装的libpng12。之后装了几个炒股软件测试,桌面快捷方式还是没图标(显示shell32默认图标)。
请教各位,你们从wine安装软件之后桌面图标显示正常吗?
回复 支持 反对

使用道具 举报

发表于 2010-9-18 22:02:36 | 显示全部楼层
一般来说,在linux 下不用图标可以启动程序的方法有很多种,而且比图标启动程序的方法方便简单许多,linux不是windows,而是unix的一种克隆。如果非要用windows,最好是用虚拟机或者双系统。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-19 04:59:40 | 显示全部楼层
Post by fjfb;2112850
一般来说,在linux 下不用图标可以启动程序的方法有很多种,而且比图标启动程序的方法方便简单许多,linux不是windows,而是unix的一种克隆。如果非要用windows,最好是用虚拟机或者双系统。


楼上说的有道理,我自己就从来没用过支持桌面图标的WM,对这方面问题完全没经验。这次是给家里老人装股票软件,有快捷方式但没有图标操作比较困难,所以想研究一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-19 07:32:41 | 显示全部楼层
看了wine源码,桌面图标是winemenubuilder负责创建的,来源是windows程序安装生成的.lnk文件。只好从这部分入手研究一下从lnk读取exe再扩展图标位图转换成png的流程,10几年没写过windows程序了不知还能不能改好。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-19 10:14:55 | 显示全部楼层
跟踪wine/programs/winemenubuilder/winemenubuilder.c,在InvokeShellLinker设置断点,IShellLinkW_GetIconLocation返回结果错误:正确结果应该是.lnk文件指向.exe文件路径,但此处返回c:\windows\system32\shell32.dll,IconId=0对应的就是那个空白图标。
根据msdn说明,IShellLinkW::GetIconLocation是shell32.dll提供的,等有空了看一下shell32.dll的相关实现。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-19 11:22:55 | 显示全部楼层
默认图标是dlls/shell32/folders.c中IExtractIconW_fnGetIconLocation提供的,怀疑是哪个com对象注册不正确或者缺少dll:
  if (!found)                                        /* default icon */
  {
    lstrcpynW(szIconFile, swShell32Name, cchMax);
    *piIndex = 0;
  }

调用栈:
#0  IExtractIconW_fnGetIconLocation (iface=0x122ff0, uFlags=0, szIconFile=0x33f1f4, cchMax=260, piIndex=0x33dbd8, pwFlags=0x0)
    at folders.c:376
#1  0x7e629cd6 in SHELL_PidlGeticonLocationW (psf=0x122fb0, pidl=0x122bf8, pszIconPath=0x33f1f4, cchIconPath=260,
    piIcon=0x33dbd8) at shelllink.c:2000
#2  0x7e629e3d in IShellLinkW_fnGetIconLocation (iface=0x1271e4, pszIconPath=0x33f1f4, cchIconPath=260, piIcon=0x33dbd8)
    at shelllink.c:2036
#3  0x7ec0d7ea in InvokeShellLinker (sl=0x1271e4, link=0x33fb20, bWait=0) at winemenubuilder.c:2227
#4  0x7ec0eff6 in Process_Link (linkname=0x22062a, bWait=0) at winemenubuilder.c:2571
#5  0x7ec107c6 in wWinMain (hInstance=0x7ec00000, prev=0x0, cmdline=0x220628, show=1) at winemenubuilder.c:3024
#6  0x7ec10e77 in wmain () from /usr/bin/../lib/wine/winemenubuilder.exe.so
#7  0x7ec10dc0 in __wine_spec_exe_wentry () from /usr/bin/../lib/wine/winemenubuilder.exe.so
#8  0x7b8554ec in call_process_entry () from /usr/bin/../lib/wine/kernel32.dll.so
#9  0x7b85612f in ExitProcess () from /usr/bin/../lib/wine/kernel32.dll.so
#10 0x7bc6faa0 in call_thread_func () from /usr/bin/../lib/wine/ntdll.dll.so
#11 0x7bc725a0 in call_thread_entry_point () from /usr/bin/../lib/wine/ntdll.dll.so
#12 0x7bc4911a in call_dll_entry_point () from /usr/bin/../lib/wine/ntdll.dll.so
#13 0xb762a80d in wine_call_on_stack () from /usr/bin/../lib/libwine.so.1
#14 0x001103a0 in ?? ()
回复 支持 反对

使用道具 举报

发表于 2010-9-19 11:31:53 | 显示全部楼层
建议用gnome或者kde的菜单来启动,老人双击图标启动或许有困难,菜单只要单击一下,移动鼠标再单击就可以了,如果非要图标启动,你可以用IDesk .
http://idesk.sourceforge.net/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-19 12:20:57 | 显示全部楼层
Post by fjfb;2112898
建议用gnome或者kde的菜单来启动,老人双击图标启动或许有困难,菜单只要单击一下,移动鼠标再单击就可以了,如果非要图标启动,你可以用IDesk .
http://idesk.sourceforge.net/
多谢你的建议,这几天教他们双击确实费了些工夫,后来把双击间隔延长才能点成功。家里机器配置不好,C3/1G/256M,除了lxde以外跑起来比较困难。我开始装的是fluxbox+idesk,但没有开始菜单,自动挂U盘不方便,习惯windows的用户转换有些困难。

问题已经找到,dlls/shell32/folders.c中IExtractIconW_fnGetIconLocation调用HCR_MapTypeToValueA打开HKEY_CLASSES_ROOT\.exe,之后调用HCR_GetDefaultIconA读取DefaultIcon值。我装的几个系统不知为何都没有这个key,所以最终生成的desktop文件用了shell32的默认图标。

导入这个注册表然后再安装程序图标就会正常,或执行wine winemenubuilder -w "C:\\users\\lifc\\Start Menu\\Programs\\XXXX\\XXXX.lnk"转换之前生成的空白图标。不过具体出错原因还不清楚,有时间再研究一下。

REGEDIT4

[HKEY_CLASSES_ROOT\.exe]
@="exefile"
"Content Type"="application/x-msdownload"
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-20 09:21:01 | 显示全部楼层
原来有问题的不是arch linux的wine,而是我每次创建.wine的操作顺序。
删除~/.wine目录后如果开始就运行vcrun6安装程序就不会创建注册表HLK\.exe键,而先运行regedit、winecfg等程序再装vcrun6或者股票软件就能正常生成这几个key。gentoo、slitaz系统之所以表现ok就是因为.wine目录是早就存在的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表