因为我们从Visual Studio6Visual Studio2008年,我们已经在使用的MFC90.dll 和msvc[pr]90.dll沿用的清单的文件,在一个私人side-by-side配置以不用担心版本或将它们安装该系统。

预-SP1,这是正常工作(并仍然有效,现在我们的开发机)。现在,我们已经做了一些测试后-SP1我一直拉我头发以来,昨天早晨。

首先,我们的国家统计局安装脚本拉dll和清单的文件中包含的文件夹。这些都不再是正确的,因为该程序仍然链接的题的版本。

所以我加的定义 _BIND_TO_CURRENT_VCLIBS_VERSION=1 我们所有的项目,以便他们将使用SP1Dll中包含的文件夹(或其后作为新的服务包出来).它花了我一小时找到这一点。

我一双重检查所产生的清单的文件在中间的文件,文件的汇编,他们正确地列出9.0.30729.1SP1版本。我的双重和三重选取决于一个干净的机器:它所链接的本地dll没有错误。

运行程序仍然得到以下错误:

该应用程序未能正确初始化(0xc0150002).点击OK,以终止应用程序。

没有搜索的我已经做了谷歌上或microsoft有拿出任何涉及我的特定问题,(但是有命回到2005年,这个错误消息)。

任何人有任何类似的问题与SP1?

选项:

  • 发现问题和解决它所以它的工作原理,因为它应该(最佳)
  • 安装包含
  • 挖掘出的古老的题dll和清单的文件,并删除#定使用目前的。(我得到了他们在一个较早的安装建立,因为微软爆炸出来的你的包含文件夹!)

编辑: 我试过重建与界定关闭(链接到题dll),而工作,只要的题dll安装在文件夹。如果SP1dll下降,这得到以下错误:

c:\Program Files\...\...\X.exe

这个应用程序未启动,原因是应用程序配置是不正确的。重新安装应用程序可以解决这个问题。

有没有其他人不得不处理与这个问题?

编辑: 只是笑着,我下载和跑了vcredist_x86.exe 为VS2008SP1在我的测试机。 它的 工程。与SP1Dll。和我的题相联系的应用程序。但 在一个私人的摆布,工作pre-SP1.

有帮助吗?

解决方案

我战胜这个问题我自己上周,并考虑自己有些专家现在)

我99%确定,并不是所有的dll和静态图书馆被重新编译与sp1版本.你需要把

#define _BIND_TO_CURRENT_MFC_VERSION 1
#define _BIND_TO_CURRENT_CRT_VERSION 1

项目使用。对于每一个项目的一个真正的世界的大小,这是非常容易忘记的一些小lib那不是重新编译。

有更多的标志定义的版本结合;它记录了 http://msdn.microsoft.com/en-us/library/cc664727%28v=vs.90%29.aspx .作为一种替代的线路上,你也可以把

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

将结合最新版本的所有VC库(CRT、MFC ATL,于).

然后,检查的嵌入清单说。下载XM资源编辑: http://www.wilsonc.demon.co.uk/d10resourceeditor.htm.打开每dll和exe在你的解决方案。看看下'XP主题清单'.检查'version'属性的右手边就是'9.0.30729.1'.如果它是'9.0.21022,一些静态的图书馆是拉在清单的旧版本。

我的发现是,在许多情况下, 版本中列入了清单。这意味着,一些图书馆使用sp1版本和别人不一样。

一个伟大的方式来调试图书馆没有预处理程序指示设置:暂时修改你的台头,以便汇编停止,当它试图嵌入的老清单。打开C:\Program 文件\Visual Studio9.0\VC\crt\包括\crtassem.h。搜索'21022'string.在那个定义,把东西无效(更改的'定义'到'blehbleh')。这样,当你汇编一个项目 _BIND_TO_CURRENT_CRT_VERSION 预处理器没有设置标志,你的编辑将停止,你会知道你需要把它们添加或提出确保它的应用无处不在。

也确保使用依赖沃克让你知道什么dll拉。这是最简单的安装一个全新的Windows XP副本没有更新(仅SP2)在一个虚拟的机。这样你肯定知道有什么在智文件夹是正在使用,而不是侧dll你提供的。

其他提示

要理解这个问题,我认为重要的是要认识到,有 四个版本的数字所涉及的:

  • (A)版本的VC标题的文件。exe是编制。
  • (B)版本的清单文件,该文件被嵌入的资源部分。exe。默认情况下,这个清单文件是自动产生的Visual Studio.
  • (C)版本的VC。Dll(第一部分的side-by-side会)复制的同一目录。exe。
  • (D)版本的VC清单的文件(部分side-by-side会)复制的同一目录。exe。

有两个版本的VC2008年DLL在运行:

  • v1:9.0.21022.8
  • v2:9.0.30729.4148

为了清楚起见,我将使用v1/v2符号。下表显示了一些可能的情况:

Situation | .exe (A) | embedded manifest (B) | VC DLLs (C) | VC manifests (D)
-----------------------------------------------------------------------------
1         | v2       | v1                    | v1          | v1         
2         | v2       | v1                    | v2          | v2          
3         | v2       | v1                    | v2          | v1
4         | v2       | v2                    | v2          | v2

结果这些情况时运行。exe关于清洁Vista SP1安装是:

  • 情况1:弹出一个示,他说:"程序的切入点XYZXYZ不可能位于动态链接图书馆"。

  • 情况2:似乎什么都没有发生当运行。exe,但记录了以下事件,在Windows'"观众的事件/应用程序日志":

    激活方面产生失败"C:\Path\file.exe".错误的清单或政策文件"C:\Path\Microsoft.VC90.CRT.MANIFEST"在线4。分身份,发现在清单不符的身份的分量要求。参考的是Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".定义是Microsoft

  • 情况下3:似乎一切都做工精细。这个是 remicles2的解决方案.

  • 情况4:这个是 它应该如何做.令人遗憾的是,作为罗尔表示,它可以是相当难以实现。

现在,我的情况(并且我认为它是一样的 crashmstr的)是nr1.问题是这些工作室的一个原因或另一个产生的客户代码(A)为v2,但由于种种原因或另一个,产生v1文件清单(B)。我不知道版本(A)可以构成。

注意到 这个整体的解释仍然是在上下文中 私人集会.

更新:最后我开始明白到底是怎么回事。显然, Visual Studio产生的客户代码(A)为v2通过默认, 相反什么,我读过一些微软的博客。所借助下面的代码行,可标志的唯一选择的版本中产生的文件清单(B),但是这个版本将可以忽略时运行的应用程序。

结论

一.exe,是编制Visual Studio2008年链接的最新版本的VC90Dll默认。你可以 使用借助下面的代码行,可标志 控制版本的VC90库将产生的清单文件。这的确可以避免的情况2在这里你得到错误信息"明显不符的身份的分量要求".这也解释了为什么情况3,因为即使没有借助下面的代码行,可标志的应用程序是相联系的最新版本的VC Dll。

情况甚至是怪异的公共边的组件,其中vcredist运行,把VC9.0Dll在Windows智目录。甚至如果.exe的清单文件的国家的旧版本的Dll应使用(这种情况时所借助下面的代码行,可没有设置标志),Windows 忽略了 这个版本的数量默认情况下!相反,Windows将使用较新的版本,如果存在系统、除了 当一个"应用程序配置文件" 使用。

只有我一个人认为这是混乱的?

所以 在摘要:

  • 私人集会、使用借助下面的代码行,可标志。exe的项目和 所有 依赖。lib项目。
  • 为公众集会,这是不需要,因为Windows会自动选择的正确版本的.Dll从智目录。

我刚想起另一种伎俩,我用来找出其静态的图书馆是虐待的行为:'查询通过的静态图书馆的string'21022'.但是,不使用"正常"的查询工具,如wingrep,因为他们不会告诉你这些字符串(他们认为它是二进制文件并查找原、非unicode string)。使用'串的'实用的资源工具包(现在的Russinovich站我认为)。那人会查询通过的二进制文件"确定"。所以你让这个'串'穿过你的整个源树,你会看到的二进制文件(dll和静态图书馆),包含提到了错误的清单(或清单有错误的版本)。

另一个不错的工具,用于查看exe和dll体现的是 清单查看, ,这恰好足够的不会上运行的一个清洁安装的XP、因为 它的 取决于9.0.21022.

为你的第三个选择,你也许可以找到Dll和表现的9.0.21022版本中的C:\WINDOWS\WinSxS 目录开发机。如果可以的话,然后你就可以建立自己的包含目录并安装这些文件的应用程序。

或者您可以使用的9.0.30729.1的人提供有Visual Studio和建立清单你安装应用程序的报告,它提供的9.0.21022Dll和不9.0.30729.1.运行连接似乎并不介意。看看这个 博客, ,这已经极大地有助于解决这些问题的更多信息。

这两种解决方法固定的问题,我不得不与部署Dll作为私人集会与VS2008表达。

罗尔的答复是要去你的第一个备选办法("修复它的权利"),但如果取决于一个图书馆,取决于9.0.21022(和你的清单因此列出了两个版本),那么第三种选择可能是唯一的办法去如果你不想跑vcredist_x86.exe.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top