欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

WinSxS 混乱导致的应用程序不能启动

张康宗(Smallfrogs)
http://www.KZTechs.com

有人看过下面的MessageBox提示信息吗:

---------------------------
C:\dllsxstest.exe
---------------------------
C:\dllsxstest.exe

由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。

---------------------------
确定  
---------------------------

 

如果看到这个错误,那么一定是因为运行库的manifest混乱或破坏导致WinSxS机制无法正常使用从而引起应用程序加载失败。

从Windows XP开始,微软引入了WinSxS机制用于解决DLL版本冲突的问题。解决方法是通过一个额外的清单文件(manifest)记录所需要的运行库的版本号等信息。进程创建的时候,CSRSS进程通过SxS.DLL模块解析manifest文件,然后加载合适的DLL版本。

今天,我这里处理了一个WinSxS版本混乱导致的应用程序无法加载的问题。

环境如下:

  • 有一个EXE文件,不依赖任何的运行库
  • 有很多DLL文件,分别在EXE文件目录的子目录下
  • EXE文件所在目录下有一套安装的VC8运行库
  • DLL文件需要依赖VC8运行库
  • 因为各种原因,没有使用 vcredist_x86.exe 把VC8运行库安装到Windows\WinSxS目录下面

使用的时候发现,EXE文件加载DLL的时候,总是提示加载失败。DLL无法启动。我用 Process Monitor 监视了一下文件的读写操作,发现EXE文件在加载DLL的时候,CSRSS总是去读取 Windows\WinSxS 目录下的运行库文件,由于没有使用 vcredist_x86.exe 把VC8运行库安装到Windows\WinSxS目录下面,因此DLL加载失败了。

我很奇怪的问题是,为什么总是忽略了EXE目录下的manifest文件,而总是使用 Windows\WinSxS 目录下的文件呢?

以前知道manifest文件可以外置,也可以内置到PE文件的资源里面,难道是内置的问题吗?用Resource Hacker打开DLL文件,果然发现了内置的清单文件。把这个资源结点删除以后,保存退出,然后再使用EXE文件加载这个DLL文件,OK~问题解决了。这次使用的是EXE目录下的运行库文件而没有使用Windows\WinSxS目录下的文件了。

BTW:对于开发人员来说,自然不能编译以后再手工删除这个资源结点,解决方法很简单,把工程的manifest设置里面的 embedded manifest 功能关闭掉,这样编译以后就会出现编译生成的目标文件和一个额外的manifest文件。使用的时候,系统会首先尝试到Windows\WinSxS目录下面寻找文件,如果文件不存在,那么会在EXE文件所在目录下寻找,而不是去DLL所在目录下寻找文件。

问题解决以后,就需要想想问什么只有在部分系统上面出现这个问题了,检查发现:没有问题的系统都使用vcredist_x86.exe 把VC8运行库安装到Windows\WinSxS目录下面了,有问题的系统,发现WinSxS目录下没有运行库文件,自然不能使用了。

目前,很多软件都使用了VC8开发,而且都使用 vcredist_x86.exe 把VC8运行库安装到Windows\WinSxS目录下面,但是有某些软件在卸载的时候,又把这个运行库卸载了,结果就会导致类似提示“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”的错误的出现。这是最常见的一种现象。另外还有下面的几种可能会导致WinSxS混乱:

  • manifest文件被破坏
  • 复制了错误的manifest文件到错误的目录,导致manifest文件里面记录的内容和实际的DLL版本不符

最后,如果你碰到提示“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”,最佳的操作方法是看看这个文件依赖的运行库是否齐备,如果不会看,最简单的办法就是重新安装所有的运行库版本到系统里面。

下面是所有常见的32位运行库版本的下载地址:

如果你不知道你使用的程序是什么版本开发的,那么就全部安装吧,嘿嘿~

BTW:WinSxS 技术从 Windows XP 开始引入,一直发扬到 Windows Vista 系统里面,表现形式就是随着系统使用时间的增加,Windows\WinSxS 目录会越来越大,这一点在 Windows Vista 系统里面会特别突出,因为 Windows Vista 系统的系统文件都是使用 WinSxS 目录存放的,Windows\System32 目录下看到的大部分文件实际上是 WinSxS 目录下文件的一个 Hard Link 而已 :)

已发表 2008年11月12日 20:07 作者 smallfrogs

评论

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月12日 23:39 by Yu9527

谢谢老师指点 受教了 谢谢

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月14日 9:27 by 路过

安装这四个版本都出现Error 1935 错误。如何解决?

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月14日 13:28 by Smallfrogs

1935 的错误含义是:

ERROR_AUTHENTICATION_FIREWALL_FAILED

# Logon Failure: The machine you are logging onto is

# protected by an authentication firewall.  The specified

# account is not allowed to authenticate to the machine.

和WinSxS没有直接关系的

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月14日 19:53 by 请教问题

Error 1935.安装程序集“Microsoft.VC80.ATL,type="win32",version="8.0.50727.42",publicKeyToken="ifc8b3b9a1e18e3b",processorArchitecture="X86"”过程中发生错误。请参阅帮助和支持获取详细信息。

再次请教!装的时候关掉KIS8.0.454还是一样的错误。

由于这个错误,Student With Encatra 2009 和Visual Studio 2008 都装不上。

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月15日 0:18 by smallfrogs

请问你的操作系统是什么?对操作系统做过什么操作?是否安装了.NET框架或者测试版本的Visual Studio?另外请给出系统日志里面的详细信息以及安装Visual Studio 时候的详细日志(可能在 %temp% 目录下)

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月15日 0:20 by smallfrogs

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月15日 19:05 by 路过,感谢smallfrogs

NetFX2.0-KB948609-v6001-x86.msu 装有这个补丁。也许问题在这个补丁上。Vista Sp1 U的系统。

之前没有安装过VS,没有单独装过.NET,和SQL Server,也没有装过测试版本的Office 2007。

还有我的Windows Update 功能坏掉了,无法安装和卸载任何更新。SFC/SCANNOW 也无法完成。Windows 资源保护无法执行请求的操作。我只能认为系统未知损坏。

smallfrogs 谢谢你,我去看看那个英文帖子。

VS的错误日志稍后补上。

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月15日 19:20 by 路过

请问如何把报告和截图发送给你?

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月16日 12:03 by smallfrogs

可以给 support@kztechs.com

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月17日 12:53 by 路过

请问您收到邮件没有?163邮箱发的。

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月18日 11:10 by Smallfrogs

没有收到哦。

# re: WinSxS 混乱导致的应用程序不能启动

2008年11月18日 14:01 by 路过

换用Gmail 发送了。

第二次163发出的信别人没有收到。

# 2008/11/26 - TechNet Flash

.tableSpacing td { padding-right: 5px; } 订阅其它的Newsletter | 取消订阅 | 更新个人信息资料 TechNet 免费中文速递邮件,提供大量有关评估,规划,部署和维护

该帖子已禁止评论