前两天在家中另一台计算机上安装最新的 Windows Live Essentials 2011 时,遇到了无法安装的问题,重试多次均是如此。按照 Windows 程序的老规矩,安装程序给出了错误代码:0×80040609。
寻找方案无果
第一反应当然是点击“获取帮助”链接,但弹出的帮助网页上并没有提供有价值的帮助。
第二方案,上网搜索。果然这个问题在网上不少人遇到,而且有朋友 Leo Chen 写出了解决方法,那就是“打开 Windows 防火墙”,但实际上它在我的电脑上运行正常。看来,我遇到的问题原因并不在这里:
上图来自 Leo Chen 的文章。在我的计算机上,错误ID相同,但“源”是不同的 WLiveRemoteService。也就是说,可能会有多种错误原因产生同一个错误代码。我们不能什么时候都依葫芦画瓢,而是应该具体情况具体分析,找准问题的根本原因。
wbpluto喜欢在介绍错误解决方法时,能同时介绍自己分析并找出错误原因的步骤,并对其中的原理进行解释,让读者能够学到更多真本事,也就是“授之以渔”,而不是只会说“这个问题应该这样解决”。
分析原因
首先想到,微软在 Windows 中的软件包,一般都使用的是 MSI 格式,虽然 Windows Live Essentials 2011 安装文件是 EXE 可执行程序,但由于其是多个应用程序的集合,应该也是由 MSI 打包而来的。如果能够找到其中的 MSI 安装包,单独安装并分析出错的组件,那应该就很好分析并解决了。
我使用能够查看 EXE 文件内部资源的 PE Explorer 软件打开安装包,发现,其中有一个文件夹名为 PACKAGE。比较可疑的名字,这里面的资源会不会是各个组件的 MSI 安装包呢?
在PACKAGE 上单击右键,释放所有资源,直接单击确定,不用设置什么,让软件将程序中所有的资源都释放出来:
找到释放出来的文件夹,打开 PACKAGE 文件夹,其中的文件都是 RES 后缀名:
其实啊,他们都是 CAB 格式的存档文件,不信把它们全都重命名为 CAB 后缀看看吧。这个步骤使用命令更方便,在 PACKAGE 文件夹上按住SHIFT单击右键,打开命令提示符窗口,运行:
ren *.res *.cab
即可把所有文件一起重命名了。双击打开,果然是可以打开的,CAB 里面是 7z 压缩文件!我用 WinRAR 把 CAB 中的 7Z 们一股脑都解压缩出来:
7z 文件的文件名已经泄漏天机,很明显这些文件就是各个 Live 软件组件的安装包,只不过被压缩成 7z 格式了。于是再把它们一股脑释放出来,晕,竟然又得到了 CAB 文件:
我就不信这是个无底洞了,再释放,终于得到了想要的 MSI 安装包:
微软把这些安装包都视为宝贝,竟然包裹了一层又一层,这是喜剧电影里才有的情节吧!微软真是太幽默啦!完整的包裹关系为:
MSI → CAB → 7z → CAB
算了,一笑而过吧。来看看手动使用 MSI 来安装出错的那个软件包会怎么样,因为 MSI 提供的原始出错信息肯定比打包后的 EXE 更接近真实的错误原因。根据 EXE 错误提示中的“源”属性,找到 WLRemoteService-i386.msi:
运行之后,提示找不到 Windows Live Remote Service 的原始安装文件 WLRemoteService-i386.msi,让手动指定(此处未截图)。手动指定到此处的 WLRemoteService-i386.msi,结果还是说找不到。这让我想起之前《Visual Studio 2008 安装失败(“Web 创作组件”无法安装)的解决办法》一文中,也有类似的问题,是因为安装了相同组件的不同版本,导致另一个版本无法安装,系统不认可这个版本的 MSI 安装包。
于是想起来,之前安装过 Windows Live Essentials 2011 的 Beta 版本,应该是卸载的时候没有卸载干净,虽然控制面板“卸载程序”中找不到 Live 组件了,但在系统中还保留了 Windows Live Remote Service,于是最终导致了这样的问题。
动手解决
可是没有旧版本的安装包,也找不到卸载程序,怎么样将其卸载掉安装新版呢?
安装在系统中的 MSI 程序包都在注册表中有记录,只要找到并删除这个记录,也就相当于将其卸载,这样就可以顺利安装新版本了。于是打开注册表编辑器,搜索“Windows Live Remote Service”名称,果然,在 HKEY_CLASSES_ROOT\Installer 中找到了这个组件的记录。将 Installer 下的这个字符串项整个删除(使用 Windows Installer Cleanup 程序应该也同理),重新安装新版的WLRemoteService-i386.msi,果然就能够顺利安装了!
对比了一下 HKEY_CLASSES_ROOT\Installer 中前后两个版本的记录,他们的 PackageCode 代码是不同的。在安装和卸载 MSI 软件时,系统就是根据这个暗号来判断 MSI 文件是否是软件原始的安装包的:
最后重试重新运行完整的 EXE 安装包安装 Windows Live Essentials 2011,本以为会顺利完成,但再次出现了两个错误:
现在就一点都不用紧张了,应该是同样的原理,有其他的几个旧版本组件也没有正常卸载掉。按照相同的方法将他们清理掉,再次安装,就完全没有问题了!
总结
至此,通过一步一步的分析深入,非常精确的确定了的原因和病灶,并顺利的接解决了此次问题,并且还发现了微软打包程序的小秘密,可以说收获还是不小的。在此wbpluto把其中的经验分享给大家,希望大家以后遇到问题也能够自己解决。
本文转自wbpluto 51CTO博客,原文链接:http://blog.51cto.com/wbpluto/476698,如需转载请自行联系原作者