2023年12月11日发(作者:)

与VC6不同, VC2003、VC2005、VC2008及其后续版本,引入了manifest清单的概念,即应用程序编译后会同时生成对应的.manifest文件,并将该.manifest文件作为资源编译到dll或者exe中去。manifest文件实际上是一个XML格式的文本文件,里面记录了dll或exe中要引用的CRT、MFC、ATL库的版本和名称。

VC6编译的应用程序对CRT、MFC、ATL的dll都是直接调用,而VC2003、VC2005、VC2008编译的程序都是先查询编译到资源中的manifest中的记录,然后按照记录提供的版本和名称去搜寻对应的CRT、MFC、ATL库,搜索路径为环境变量中定义的路径,若搜索到的文件版本号不匹配,则不会调用,从而导致应用程序配置不正确,程序无法启动或初始化失败等错误(相关信息可以在电脑日志中查看得知)。

DLL的版本信息可以使用软件查看,如下图所示(红色框内既为版本号):

至于你系统内的版本号,可以到VS安装目录下的查看,本文以VS2008 CRT库为例:

可以看到,其版本号均为9.0.30729.4148,于上面DLL的一致,故不会存在问题

VS2008的使用库目前为止分为三个版本:

 没有打过任何补丁的VS2008

该版本对应的CRT/MFC/ATL库的版本号为9.0.21022.8。

 2、打过SP1补丁的VS2008和KB973675补丁

打过该补丁后,系统中存在着两个版本的CRT/MFC/ATL库,版本号分别为9.0.21022.8和9.0.30729.1,这导致了manifest文件中记录的版本号和实际库的版本号不一致(程序要求它们的版本号一致才能运行)。这时需要在工程设置中增加一个宏定义_BIND_TO_CURRENT_VCLIBS_VERSION,该宏定义于C:Program FilesMicrosoft

Visual Studio 9.0VCincludecrtassem.h文件中,然后重新编译程序。然后还得将VS安装目录下的相对应库以及对应的manifest文件拷贝到执行程序同目录下。  3、打过SP1补丁、KB973675补丁与KB971092补丁

这是最新的更新,将CRT/MFC/ATL库的版本号升级到了9.0.30729.4148,仍需在工程设置中增加一个宏定义_BIND_TO_CURRENT_VCLIBS_VERSION,以及将对应的库文件和manifest文件拷贝到执行程序同目录下,这样程序到任何机器上都能够正常运行了。