Linux 下使用 Wine 安装运行 TM2008 Beta 及乱码、与 Windows 共享聊天记录等相关问题的解决

[撰文/Rainux]

前言

腾讯已经发布了官方的 QQ for Linux,虽然有很多问题,例如没有 amd64 版本,功能太弱,聊天记录格式与 Windows 下的 QQ/TM 格式不一致等等,但无疑是 Linux 里使用 QQ/TM 最简单的方案。如果它已经能满足你的需求了,那么不必浪费时间看本文。

精简版本

如果你没时间看我唠叨,精简的版本是:TM2008 Beta 运行需要 Unicode 版本的 IE6、rpcrt4.dll、Visual C++ 2005 SP1 运行库,安装程序需要 GDI+。不可以使用 IEs4Linux,因为它安装的 IE6 及相关运行库是 Win9x 的 ANSI 版本。必须使用 CrossOver Games 里的 rpcrt4.dll,然后用 winetricks 安装 msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1 即可安装运行 TM2008 Beta。

详细版本

只看精简版没搞定?请看详细的(唠叨的)版本:

安装 Wine,运行一下 winecfg,让它生成一个干净的 ~/.wine 目录。如果要使用已有的 ~/.wine,请先将其备份。同时确保 winecfg 里设置的 Windows 版本至少是 Windows 2000(我用的是 Wine 1.x 默认的 Windows XP)。

获取一份 CrossOver Games 里的 rpcrt4.dll,将其复制为 ~/.wine/drive_c/windows/system32/rpcrt4.dll(覆盖已有的文件),运行 winecfg,在 Libraries -> DLL Overrides 里将 rpcrt4 设置为 Native (Windows)。

下载 winetricks,使用它安装 IE6 和一些重要的运行库。如果这个过程失败,删除 ~/.wine(或者恢复备份的 ~/.wine)并从头再来。

sh winetricks msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1

此时如果你有 Windows 上安装好的 TM2008,它已经可以运行了,但是无法登录,会提示“网络连接失败,请检查网络。”。所以还是老老实实用安装程序装一次吧。这里有个很莫名的问题,如果直接使用 Wine 运行 TM2008 安装程序,它很可能会直接崩溃,看不到任何图形界面的提示。而使用 Wine 运行一个其它的程序,例如 cmd.exe 或者 Total Commander,再用这个程序去启动 TM2008 安装程序则不会有任何问题。

中文乱码(空心方框)问题

好吧,终于看到 TM2008 的安装界面了,不过很可能你又会头大了——所有的中文全是空心方框。原因是安装程序界面的字体是被指定为 Tahoma 的,而实际上 Tahoma 字体并不包括中文字符。有两个办法解决,都是 Windows 的技术,把 Tahoma 字体替换成某个中文字体,或者把某个中文字体链接到 Tahoma 上。照这两个片段修改 ~/.wine/system.reg,只需要其中一个。别忘了把中文字体名改成你自己需要的。

[Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes] "MS Shell Dlg"="Microsoft YaHei" "MS Shell Dlg 2"="Microsoft YaHei" "Tahoma"="Microsoft YaHei"

[Software\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink] "Tahoma"=str(7):"SimSun.TTC,SimSun\0"

最后还必须把你改的中文字体文件符号链接到 ~/.wine/drive_c/windows/Fonts 目录下,不这么做其它软件都没问题,就 QQ 或 TM 会乱码,该死的硬编码。

查看聊天记录时的性能问题

好了,现在不会有什么问题阻挡你了,TM2008 Beta 安装和启动都非常顺利,使用也很稳定。甚至 QQ2009 Preview4 都可以安装并启动,不过使用时很容易崩溃。但是如果你像我这样疯狂地保存了七八年的聊天记录,你会发现:

  • 每次启动 TM2008 后第一次给任何人发消息都会导致 TM2008 失去响应将近 20 秒钟,之后继续发消息则不会有问题。第一次接收到某人的消息也会同样如此。
  • 任何试图查看聊天记录的操作都会导致 TM2008 消耗 100% CPU 并且很长时间没有反应,等待足够长的时间后才可以看到聊天记录。

这是由于 TM2008 的聊天记录数据库使用了 Windows 的 Structured Storage 技术,而其 API 库 ole32.dll 的 Wine 实现还不完善或者可能性能太低。虽然可以用 winetricks 安装 dcom98 来获取一个 Win9x 的 ANSI 版本的 ole32.dll,但它没法让 Unicode 版本的 TM2008 运行起来。搜遍了网络也找不到在 Wine 里使用 Win2k 以上系统的 ole32.dll 的方法。没办法,为了保持聊天记录的一致性,只有两个选择。要么不在 Linux 里看聊天记录;要么把聊天记录数据库 Msg2.0.db 备份并从 QQ Profile 目录(我的文档\QQ Files\QQ 号码)里删除,让 TM2008 自己生成一个空白的 Msg2.0.db,暂时抛弃历史包袱,以后再到 Windows 下把新的记录导出为备份文件后合并到老的数据库里。

与 Windows 共享聊天记录

如果你还像我这样偶尔会切换到 Windows,希望跟 Windows 下的 TM2008 共享聊天记录数据库,那么有两个办法:

  • 直接在 Linux 里使用 ntfs-3g 读写存放 TM2008 聊天记录的 NTFS 分区。虽然 ntfs-3g 已经号称非常稳定可靠了,但对于聊天记录这种极度个人化的数据我还是宁可保守一些。
  • 创建一个 ext2 分区用来和 Windows 共享数据,在 Windows 下可以用 Ext2 IFS 驱动来访问它。比起私有文件系统 NTFS 的 Linux 版开源驱动来说,当然是开源的 ext2 文件系统的 Windows 版驱动更值得信赖。

用这两种办法都需要在 Linux 和 Windows 里创建 QQ Files 目录的符号链接,Linux 里不必说,ln -s 即可。Windows Vista 以前的版本可以用 Junction 来创建 NTFS 上的符号链接,Windows Vista 可以用自带的 MKLINK。

对于我这种非笔记本用户来说使用日志文件系统来抵御意外断电是必须的。按照 Ext2 IFS 的 FAQ,它也可以读写 ext3 分区。不过比较新的 Linux 发行版的 mkfs.ext3 创建的 ext3 分区 Ext2 IFS 是无法访问的,可能是 ext3 文件系统格式发生了变化。而 Windows 下一些分区工具如 Paragon Partition Manager 或 Acronis Disk Director 创建的 ext3 分区则没有问题。

参考资料

[原文连接]

Read More:

31 Comments

  1. 1 jerry Commented @ 2008-12-08 19:51Reply to this comment

    麻烦阿

  2. 2 fireflyoo Commented @ 2008-12-08 19:57Reply to this comment

    Linux下不是有eva o pidgin o 腾讯QQ可用吗。。

  3. 3 hantsy Commented @ 2008-12-08 20:05Reply to this comment

    非常不喜欢wine的东西,还不如直接装在虚拟机中用呢。

  4. 4 Edward Commented @ 2008-12-08 20:30Reply to this comment

    有EVA 了,要那个干嘛

  5. 5 dogfox Commented @ 2008-12-08 20:46Reply to this comment

    eva对qt4不感冒

  6. 6 Rainux Commented @ 2008-12-08 20:48Reply to this comment

    主要是为了保持聊天记录的一致性,只使用一种格式存在一个集中的地方,不管是搜索还是以后导出自己写程序处理都方便。

    Wine 虽然会遇到很多问题,但无可置疑比虚拟机消耗的内存更少。

  7. 7 糊涂 Commented @ 2008-12-08 21:01Reply to this comment

    Windows Only的东西就让它慢慢自己死掉吧。还搞那么麻烦干吗?浪费!有这精力给Linux新手们写点入门教材好不好。Toy也真是的,浪费版面,浪费服务器空间,浪费服务器带宽,浪费......。还有我居然看完了,还回复了,浪费!

  8. 8 布谷鸟 Commented @ 2008-12-08 21:21Reply to this comment

    @糊涂: wine狂人,我就喜欢。

  9. 9 dragon Commented @ 2008-12-08 21:49Reply to this comment

    我用wine1.1.10装qq2008极速版倒是直接安装运行就可以了。其他都蛮方便的,问题就是共享里的文件,无论下载到哪里都会说是系统保护目录。。。 不知谁有什么解决方法...

  10. 10 Rainux Commented @ 2008-12-08 21:52Reply to this comment

    @糊涂: (或许这不是你的名字)我这么做有三个原因:我跟很多人一样因为大量朋友家人在 QQ 上而没有办法完全抛弃 QQ;没有写日记习惯的我认为 QQ 聊天记录是很重要的个人历史数据;Linux 下没有一个能让我方便处理聊天记录的 QQ 客户端。腾讯的 QQ for Linux 和 Eva 都使用了另外一种我不了解的二进制格式来存储聊天记录,并且 Eva 还不提供聊天记录搜索和导出功能。至少使用 Windows 版的 TM 我可以很方便的把聊天记录导出为 mht 格式,然后自己写个很简单的小程序来解析并使用一个 RDBMS 来存储它们,以便搜索和备份。

    做完之后我觉得或许有人跟我有类似的想法,所以把它写出来。不管从哲学上讲它有多不正确,至少它解决了我的实际问题,让我现在可以真正完全使用 Linux 做家用桌面系统。

  11. 11 ALias Commented @ 2008-12-09 0:18Reply to this comment

    嗯,至少我觉得这个是很有用的

  12. 12 X Commented @ 2008-12-09 2:47Reply to this comment

    我更想知道如何用wine玩撕裂重罪

  13. 13 wangping Commented @ 2008-12-09 8:44Reply to this comment

    呵呵,能让用linux的人少启动一次电脑,少切换一次windows就是好事

  14. 14 黑日白月 Commented @ 2008-12-09 8:52Reply to this comment

    @Rainux & 布谷鸟 呵呵,我也是 WINE 狂人…… 建议可以为 QQ 建立独立的 WINE 环境,这样避免替换了一些 dll 后影响其他软件,可以用: WINEPREFIX=$HOME/.wine-qq winecfg 创建并配置一个独立的 wine 环境,如同 CrossOver 的 Bottle 一样。

    @X 可否给出英文名?在 Wineappdb 上查不到么?

  15. 15 黑日白月 Commented @ 2008-12-09 9:01Reply to this comment

    @Rainux 可否麻烦注明下使用的 WINE 的版本呢?这样方便通过搜索引擎找到此文的朋友参考。

    新的 Linux 发行版中的 mkfs.ext3 貌似会自动修改分区类型识别码为 87,不知道是不是这个原因导致 ext2fs 不能读。

  16. 16 Centeur Commented @ 2008-12-09 9:02Reply to this comment

    不喜欢 Wine,还不如直接装虚拟机。

  17. 17 wangping Commented @ 2008-12-09 9:20Reply to this comment

    如果只是为了qq,wine还是比虚拟机省事

  18. 18 Toy Commented @ 2008-12-09 9:46Reply to this comment

    @糊涂: 我不觉得这是浪费。我始终对分享者保持尊重和感激。即便不是 Wine TM,本文解决问题的方式也是值得借鉴的。

  19. 19 shiny Commented @ 2008-12-09 9:49Reply to this comment

    这就一个麻烦啊~ qq如此重要么? 曾经很重要来着,但是现在呵呵,还是for kids吧~

  20. 20 qubicllj Commented @ 2008-12-09 10:06Reply to this comment

    官方的tar.gz版本可以在64位上运行

  21. 21 pig345 Commented @ 2008-12-09 10:23Reply to this comment

    LZ厉害,支持一下。

  22. 22 luyaotang Commented @ 2008-12-09 11:18Reply to this comment

    支持一下,毕竟为了运行一个EXE程序而开个虚拟机,实在不划算。。

  23. 23 keenan chen Commented @ 2008-12-09 14:43Reply to this comment

    20楼说的对,我就是64位的,下载tar的能用

  24. 24 X Commented @ 2008-12-09 17:10Reply to this comment

    中文: 撕裂重罪 英文: hinokakera 日文: ヒノカケラ

  25. 25 yjwork Commented @ 2008-12-09 17:18Reply to this comment

    64位运行是要安装32位库支持才可以的 不那么纯正 还是希望能出个纯正点的64位

  26. 26 Eidolon Commented @ 2008-12-09 18:16Reply to this comment

    QQ出来时,我以为是一个全功能版的。用了之后,就没有再用的兴趣。 我的QQ上没有几个正经朋友,经常联系的朋友们都在MSN上,QQ与我来说,可有可无。

  27. 27 yang Commented @ 2008-12-09 22:51Reply to this comment

    既然如此,为何不直接windows?

  28. 28 Rainux Commented @ 2008-12-10 9:23Reply to this comment

    @黑日白月: 呵,其实我不是什么 Wine 狂人,我只用 Wine 运行了两个软件,Total Commander 和 TM。TC 的目录同步功能很不错,Krusader 目前还没那么好用,diff -ur 也很不错,不过排除部分文件时不够方便。

    我的环境是 Debian Lenny amd64,wine-1.0.1。

    你说的是 fdisk 里看到的 Id 吗?我用所有方式创建的 ext3 分区 Id 都是 83,但是 Ext2 IFS 会把 PPM/ADD 创建的分区正确识别为 ext3,较新 mkfs.ext3 创建的分区识别为 Linux。

  29. 29 Rainux Commented @ 2008-12-10 9:27Reply to this comment

    @yang: 因为我主要需要的是 Linux 而不是 Windows。虽然 Windows 里有 Cygwin 有 coLinux 也有虚拟机,但可用性和性能显然都不如直接运行的 Linux 好。

  30. 30 Rainux Commented @ 2008-12-10 9:36Reply to this comment

    @黑日白月: 抱歉,回 Windows 看了一下,Ext2 IFS 会把 ext3 分区识别为 ext2,之前记错了。

  31. 31 cnlions Commented @ 2008-12-10 20:08Reply to this comment

    干吗不去http://wineqq.googlecode.com看看? 下载个现成的就好了。

    http://wineqq.googlecode.com/svn/trunk/7z/wine-qq2008ii-skel-1.7z