本文适用于Ubuntu 20.04 LTS的衍生版本 Linux Mint 20.2 Xfce、Linux Mint 20.2 Cinnamon、Ukylin Linux 20.04,并测试有效,其他版本未进行测试
本人之前一篇文章已经描述了如何在Ubuntu 20.04 LTS的衍生版中安装QQ,使用的是原生的稳定版Wine-6.0.2,通过打补丁的方式替换掉原有的winex11.drv.so解决Ukylin-wine QQ状态图标叠加显示故障和来信息不进行闪烁提示的问题,而且运行稳定;但是我用同样的加过补丁的wine 6.0.2运行优麒麟Ukylin提供的微信容器Bottle,采用运行QQ的方法却无法成功,运行启动脚本/opt/ukylin-wine/apps/wechat/run.sh,报告一个关于OpenGL方面的错误以后就退出,不显示微信登录的二维码窗口。经过12月12日开始到12月22日这么多天的空余时间的反复做实验,总算把现在已知的所有问题解决完了,真是到了山穷水尽打算放弃的状态了,期间大部分时间被微信公众号打开显示窗口为白底框或黑底框,看不到任何内容的问题困扰,一直都以为是wine的Gecko插件工作不正常引起的,在上面花了大量的时间,实际上微信程序并不需要Gecko组件的支持,到了22日晚上的一个实验完成才柳暗花明,现在能够心情舒畅的使用微信了,下面是是主要的操作步骤介绍,一方面是自己做一个记录,另一方面供其它感兴趣的同学做一个参考。
1、首先也是和安装QQ一样,要先通过官网安装Wine-6.0.2稳定版;
    这个的安装步骤是采用的Wine网站提供的步骤进行安装,也可以查看我的另一篇文章的关于这部分内容的介绍。
    以下2~5步为源代码编译的环节,如果不感兴趣的网友可以跳过(直接到文后的百度网盘中下载得到需要的补丁文件),直接进入第6步;
2、下载Wine-6.0.2稳定版的源代码,安装编译缺少的dev软件包,然后去除OpenGL的开发包;
    下载源代码压缩包并解压到自己方便操作的目录中,并安装编译可能缺少的dev软件包。
    如果不安装编译缺少的dev包,运行微信的wine模块编译完成并运行,字体很淡,看起来比较难受(但此时也不存在很多人反映的阴影框的问题,微信的阴影框变成了操作系统提供的默认阴影),因此尽可能多的安装缺少的dev包,我运行以下命令进行安装的:
    sudo apt-get install libxcursor-dev:i386 libxi-dev:i386 libxxf86vm-dev:i386 libxrandr-dev:i386 libxfixes-dev:i386 libxinerama-dev:i386 libxcomposite-dev:i386 libosmesa6-dev:i386 ocl-icd-opencl-dev:i386 libpcap-dev:i386 libsane-dev:i386 libv4l-dev:i386 libgphoto2-dev:i386 liblcms2-dev:i386 libpulse-dev:i386 libudev-dev:i386 libsdl2-dev:i386 libfaudio-dev:i386 libcapi20-dev:i386 libcups2-dev:i386 libfontconfig1-dev:i386 libgsm1-dev:i386 libkrb5-dev:i386 libtiff-dev:i386 libmpg123-dev:i386 libopenal-dev:i386 libvulkan-dev:i386 libvkd3d-dev:i386 libldap2-dev:i386 libxrender-dev:i386 libxml2-dev:i386 libxslt1-dev:i386 libgnutls28-dev:i386 libjpeg-dev:i386
    下面就要去除OpenGL的开发支持包,为什么要去除,因为带着OpenGL编译就会出现前面说的微信无法启动并报告OpenGL方面的故障。运行以下命令删除OpenGL相关的dev软件包:
    sudo apt-get remove libglx-dev:i386
3、在源代码的根目录中执行./configure,进行编译配置;
    任何dev开发包的变动都需要重新执行一次这个命令确保编译后得到期望的功能和效果。此命令执行后再到相应的目录中执行make指令,如果在当前目录下进行整个wine的编译时间会很长,我的T400需要约3个小时,因此为了提高效率,只需要编译自己做了修改的相应模块即可。
4、在源代码的dlls/winex11.drv子目录中,修改bitblt.c源文件,进入目录并执行make命令生成winex11.drv.so;
    这个文件的补丁操作是解决状态图标不正常的问题,在此模块中的代码有关于systray的代码,但是需要修改的却不是systray.c,而是bitblt.c文件,将其中引起图标覆盖显示故障和引起新信息闪烁故障的相关代码进行删除或注释掉,这个操作在之前安装QQ的过程是一样的操作。修改完成后保存,执行make指令,即可生成自己需要的winex11.drv.so,但是目前这个修改只对32位的容器Bottle有效,具体原因以后慢慢学习,64位的容器仍然存在图标不正常的情况,但是当前深度和优麒麟都安装使用的是32位程序,所以这个研究并不紧急。
5、在源代码的dlls/user32子目录中,修改win.c源文件,进入目录并执行make命令生成user32.dll.so共享库文件;
    这个补丁是解决微信普遍存在的窗口阴影问题的,微信的每一个程序界面都绘制了两个窗口,一个是提供各种功能实现的窗口,另一个是绘制阴影的窗口,网上大部分的解决方案都是通过脚本程序每隔2~3秒钟检测窗口是否存在,如果存在就将这个窗口移到看不见的位置,实际上这种处理方法使用的体验还是比较差,我搜索到Arch Linux的使用者通过修改win.c,来实现不绘制阴影窗口的目的,也就不再需要定期检测窗口并处理的脚本了。我将该补丁使用到Wine-6.0.2中,发现确实有效,而且对32和64位的容器Bottle都有效。该补丁是这样的,在win.c的WND WINAPI DECLSPEC_HOTPATCH CreateWindowExW()函数中添加,在第1799行添加if()开始的5句。
    cs.lpszClass = className;
    cs.dwExStyle = exStyle;
    具体是在上述 语句后添加下面几个语句,是以窗口的exStyle属性来判断是否为阴影窗口,如果是则直接返回不做任何操作。
    + if (exStyle == 0x080800a0) // WeChat/WxWork shadow hwnd
    + {
        FIXME("hack %x\n", cs.dwExStyle);
    +      return NULL;
    + }
6、在Wine-6.0.2安装路径/opt/wine-stable/lib目录中将编译得到的两个文件进行替换操作,同时删除掉wine-6.0.2安装后lib目录中存在的user32.dll文件;
    将编译得到的user32.dll.so、winex11.drv.so两个文件拷贝到/opt/wine-stable/lib目录中,同时还应该删除掉同一目录中的user32.dll,如果不删除这个文件对win.c所做的修改就不会生效,仍然会存在阴影窗口。
7、安装优麒麟的ukylin-wine微信安装包,得到一个32位微信的容器及启动脚本;
   我使用大家都在使用的创建32位容器的命令来创建Bottle:WINARCH=win32 WINEPREFIX=/home/ericden/.wine/wechat winecfg
   但是我生成的容器,所有的wineserver都认为是64位的,我还没找出错误的原因,使用64位容器,图标问题无法解决,而且打开微信公众号的时候存在不稳定的情况,有时公众号打开了又迅速回到一片空白的状态。为了走捷径,使用现成的由优麒麟提供的微信32位容器,因此我就到优麒麟的官网下载该安装包。下载地址为:
   http://archive.ubuntukylin.com/software/pool/partner/ukylin-wechat_3.0.0_amd64.deb 
8、进入微信的bottle中删除C:\Program Files\Tencent下的WeChat目录;
    这个是让我耽误了非常多时间,也就是12月22日晚上才想出的办法,也是让我柳暗花明的操作,之前我的微信公众号打开显示窗口为白底框或黑底框,我在网上查看其它网友的反馈,是否存在这个情况,结果只有在deepin深度系统的论坛中有一个用户反馈这个情况,而且其它用户也没有提供解决办法,说明这是一个极罕见的情况,几乎所有基于原生wine安装微信的网友都未发现,因此在22日晚上我想到了在优麒麟提供的Bottle中删除掉微信安装目录,重新再次安装一遍,就是模拟完全新装微信,后面来看这个思路是正确的。为什么重新安装就可以,原因我现在也还不清楚。
9、在主目录中的隐藏目录.cache中创建winetricks子目录,在此子目录中创建两个子目录:win2ksp4和msls31,已创建则略过;
    (9、10两步都是为第11步的完成做准备,因第11步的运行中下载部分无法完成,需要手动去下载并放到程序需要的目录中)
10、在msls31目录中拷贝入InstMsiW.exe,在win2ksp4目录中拷贝入W2KSP4_EN.EXE,这些文件在文后的百度网盘中提供;
    (9、10两步都是为第11步的完成做准备,因第11步的运行中下载部分无法完成,需要手动去下载并放到程序需要的目录中)
11、在终端中执行命令:WINARCH=win32 WINEPREFIX=/home/ericden/.ukylin-wine/wechat winetricks riched20完成riched20.dll的安装;
    这个操作就是要解决文本输入框看不到输入文字的问题,就像其他网友说的直接将riched20.dll文件拷贝到C:\Windows\System32是没有用的,因为还涉及到注册表操作等内容,必须要使用WINARCH=win32 WINEPREFIX=/home/ericden/.ukylin-wine/wechat winetricks riched20命令来完成文件拷贝以及注册表操作等工作。
12、在终端中执行命令:WINARCH=win32 WINEPREFIX=/home/ericden/.ukylin-wine/wechat wine WeChatSetup.exe完成微信程序的安装;
    安装中要选择安装目录为C:\Program Files\Tencent,否则后面需要操作启动脚本中用到的快捷方式文件“微信.lnk”;如果安装到其他目录则需要将“微信.lnk”文件拷贝到“$HOME/.ukylin-wine/wechat/dosdevices/c:/users/Public/桌面” 目录中。
13、将启动脚本/opt/ukylin-wine/apps/wechat/run.sh中调用ukylin-wine的语句修改为wine;
    由于我们系统中并未安装ukylin-wine,因此需要将文件中的/usr/bin/ukylin-wine替换为wine,具体的启动语句为:
    env WINEPREFIX="$HOME/.ukylin-wine/wechat" WINEDLLOVERRIDES="mscoree,mshtml=" wine C:\\\\windows\\\\command\\\\start.exe /Unix $HOME/.ukylin-wine/wechat/dosdevices/c:/users/Public/桌面/微信.lnk
    这个语句后面的脚本就是多余的了,因为阴影窗口根本就没有绘制了,所以关于他的检测与一动都是不需要的,删除或注释掉即可。
14、这样就可以用优麒麟微信安装包创建的微信启动菜单项来启动微信了。
    实际上终端中运行脚本/opt/ukylin-wine/apps/wechat/run.sh也一样可以启动微信,而且可以看到程序运行的一些状态信息,比如可以看到阴影窗口被屏蔽的消息提示。
    下面为我文中提到的几个文件:
    链接: https://pan.baidu.com/s/1RGSzt-G8YsAxJFXBd2ypKw 密码: 2bg5
Logo

更多推荐