中国开发网: 论坛: 程序员情感CBD: 贴子 760270
haitao
很多是讲开发者要怎么注意,但是我现在是别人的程序,我是无法改的了,最多只能更改我的os里的dll、配置。。。。。。
Scenario 5:
Works in Windows XP but not in Windows Server 2003 or vice versa. On Windows XP the stand alone manifest overrides the embedded manifest where as in Windows Server 2003 the embedded manifest always overrides the stand alone manifest.

It is recommended to have embedded manifest with correct information.
This will also avoid the overhead of shipping external manifest.


为了解决dll地域,又来了manifest地域!

http://hi.baidu.com/sillyboy/blog/item/3f200ef4e0fa5a67ddc47411.html

2009-09-07 11:48张康宗(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位运行库版本的下载地址:

适用于 Visual C++ 2005 开发的程序的运行库版本:http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&displaylang=zh-cn
适用于 Visual C++ 2005 SP1 开发的程序的运行库版本:http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14-984D-389C36F85647&displaylang=zh-cn
适用于 Visual C++ 2008 开发的程序的运行库版本:http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&displaylang=zh-cn
适用于 Visual C++ 2008 SP1 开发的运行库版本:http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=zh-cn
如果你不知道你使用的程序是什么版本开发的,那么就全部安装吧,嘿嘿~

BTW:WinSxS 技术从 Windows XP 开始引入,一直发扬到 Windows Vista 系统里面,表现形式就是随着系统使用时间的增加,Windows\WinSxS 目录会越来越大,这一点在 Windows Vista 系统里面会特别突出,因为 Windows Vista 系统的系统文件都是使用 WinSxS 目录存放的,Windows\System32 目录下看到的大部分文件实际上是 WinSxS 目录下文件的一个 Hard Link 而已 :)
我的blog:http://szhaitao.blog.hexun.com & http://www.hoolee.com/user/haitao
--以上均为泛泛之谈--
不尽牛人滚滚来,无边硬伤纷纷现 人在江湖(出来的),哪能不挨刀(总归是要的)
网络对话,歧义纷生;你以为明白了对方的话,其实呢?

您所在的IP暂时不能使用低版本的QQ,请到:http://im.qq.com/下载安装最新版的QQ,感谢您对QQ的支持和使用

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录