上周我自己就解决了这个问题,现在我认为自己是一位专家了;)
我 99% 确信并非所有 dll 和静态库都是用 SP1 版本重新编译的。你需要把
#define _BIND_TO_CURRENT_MFC_VERSION 1
#define _BIND_TO_CURRENT_CRT_VERSION 1
into every您正在使用的项目。对于每个实际规模的项目,很容易忘记一些未重新编译的小库。
还有更多标志定义要绑定到的版本;它记录在http://msdn.microsoft.com/en-us/library/cc664727%28v=vs.90%29.aspx http://msdn.microsoft.com/en-us/library/cc664727%28v=vs.90%29.aspx。作为上面几行的替代,您还可以输入
#define _BIND_TO_CURRENT_VCLIBS_VERSION 1
它将绑定到所有 VC 库(CRT、MFC、ATL、OpenMP)的最新版本。
然后,检查嵌入式清单的内容。下载XM资源编辑器:http://www.wilsonc.demon.co.uk/d10resourceeditor.htm http://www.wilsonc.demon.co.uk/d10resourceeditor.htm。打开解决方案中的每个 dll 和 exe。查看“XP 主题清单”下的内容。检查右侧的“版本”属性是否为“9.0.30729.1”。如果是“9.0.21022”,则某些静态库正在拉入旧版本的清单。
我发现,在很多情况下,both版本包含在清单中。这意味着某些库使用 sp1 版本,而其他库则不使用。
调试哪些库没有设置预处理器指令的一个好方法是:临时修改平台标头,以便编译在尝试嵌入旧清单时停止。打开 C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\include\crtassem.h。搜索“21022”字符串。在该定义中,放置一些无效的内容(将“define”更改为“blehbleh”左右)。这样,当您编译项目时,_BIND_TO_CURRENT_CRT_VERSION
未设置预处理器标志,您的编译将停止,您会知道您需要添加它们或确保它在所有地方都应用。
还要确保使用 Dependency Walker,以便了解正在引入哪些 dll。最简单的方法是在虚拟机上安装没有更新的全新 Windows XP 副本(仅 SP2)。这样您就可以确定 SxS 文件夹中除了您提供的并排 dll 之外没有任何内容被使用。