04
2010

QQ 便携版试作(失败)

QQ 从一开始就是很便携的,虽然它的体积一直在长。直到 QQ2009,如果你是复制或重装系统的话便有可能遇到配置不正确的问题。

应用程序配置不正确

这时如果你打开事件查看器的话,便会看到三条 SideBySide 错误消息。

SideBySide错误
SideBySide错误
SideBySide错误
SideBySide错误

SideBySide Assembly 是微软在 VS2005 中引进的技术,用来解决 DLL Hell 问题。DLL Hell 其实就是不同版本的兼容问题。SideBySide 管理程序的 DLL,在程序调用的时候告诉程序,你需要的 X 版本的 DLL 在目录 Y。 找不到的话就提示使用者“配置错误”。

QQ 依赖的是 VC2005 运行库,出现这个问题的话只要安装运行库就可以了。对于便携版来说,这便有的系统依赖。在没有安装的系统上还是会出现错误。

对于“配置错误”的另一个办法就指定 DLL ,将需要的 DLL  放到程序目录。把下载的 QQ 安装文件解开后可以找到 VC 运行库文件夹,复制到 QQ 的 Bin 目录下。这时运行QQ,成功了吗?答案是否定的,对于 QQ 来说还有其它问题。

应用程序初始化失败
SideBySide错误
SideBySide错误
SideBySide错误
SideBySide错误

系统消息说标识不匹配?这次失败的是 Common.dll 了。使用 ResEdit 打开查看内置的 manifest 文件。

 

再打开其它文件看看,还有 4053 和 762 两版本混用的。这种情况下让系统自己去处理,但是指定 DLL 似乎没有解决的办法,只好修改内置的 manifest 文件,先用下面的命令导出:

for %i in (*.exe) do mt -inputresource:%i;#1 -out:%i.manifest
for %i in (*.dll) do mt -inputresource:%i;#2 -out:%i.manifest

然后修改导出的 manifest 文件,762 改为 4053,删除重复的依赖(一个文件里同时依赖两个版本,囧)。最后把改好的 manifest 文件导回去,同样用命令:

for %i in (*.exe.manifest) do mt -manifest %i -outputresource:%~ni;#1
for %i in (*.dll.manifest) do mt -manifest %i -outputresource:%~ni;#2

同时依赖两的版本的会导不进去,先在 ResEdit 里删除 manifest 就可以了。现在,大功告成,再运行,是不是熟悉的 QQ 登录窗口。别高兴太早,填写账号密码登录。

成功运行
登录
又失败了

囧,或许在 SideBySide 上想办法才是正道。

参考资料:
小李贼 Side-by-Side Assembly相关
熊力 WinSxS SidebySide 和 淘宝旺旺

Leave a Reply

点击图片上的十字中心提交评论。