8/27/2009

关于最近Visual Studio的ATL更新

如果使用Visual C++ 2005或者2008,那么这个更新可能已经被自动安装了。这个更新修补了ATl库中的一些安全问题。在安装这个更新之后,Visual C++运行时刻库会升级。这意味着如果代码面向的CRT版本是_CRT_ASSEMBLY_VERSION或者_BIND_TO_CURRENT_VCLIBS_VERSION,那么要随着新编译的程序发布新版本的CRT。如果程序没有定义这些宏,那么安全更新安装的重定向策略会把绑定到旧版本的引用自动转向新的CRT版本。

一个常见的问题是链接到旧版本的编译器生成的库文件。这样会在编译器生成的应用程序清单中生成两个不同版本的CRT引用。这时候要用合并模块或者手动编辑策略文件,确保重定向策略被正确安装到系统。

由于用户未必安装了Windows Update补丁,程序员需要随程序发布最新的Visual C++文件。对于vcredist发布的程序,可以直接下载Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package ATL Security Update。这个再发布包也可以在安装了Visual Studio的计算机中找到。对于使用安装程序制作工具的场合,Visual Studio会更新安装和部署项目使用的合并模块(Program Files\Common Files\Merge Modules)和bootstrapper(Program Files\Microsoft SDKs\Windows\版本号\Bootstrapper\Packages或者Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages),第三方安装程序制作软件则可能需要安装补丁或者手动替换Visual C++文件。如果应用程序把VC文件发布到安装文件夹,那么安装文件夹内的文件也需要更新以使用最新的运行时刻库和版本重定向策略。

一些旧版本的Windows SDK也包含ATL,建议使用新版本的ATL以避免安全问题。如果在安装了Visual Studio 2008 SP1之后安装了Windows SDK 6.1,那么在编译ATL项目时会出现编译错误

error C2039: '_Swap_adl' : is not a member of 'std' c:\program files\microsoft visual studio 9.0\vc\include\xutility 2764
error C3861: '_Swap_adl': identifier not found c:\program files\microsoft visual studio 9.0\vc\include\xutility 2764

这是由于Windows SDK 6.1包含Visual Studio 2008版本的ATL。解决办法是卸载SDK和VisualStudio,先装SDK,后装Visual Studio、SP1和ATL更新。

这个更新包含的不只是ATL的头文件,可以在KB971092里面看到大堆的PDB和再发布文件也被更新了。不建议手动更改ATL头文件来绕过安全问题,这样的话微软的更新程序不能更新修改过的文件。如果你已经手动更改了ATL的头文件,可以重新运行VisualStudio安装程序,卸载VisualC++之后重新安装,再应用SP1和ATL更新。下次修改系统头文件的时候,可以把文件复制到自己的目录,修改之后更改Visual C++的目录搜索路径。

关于这个更新的更多信息,可以参考MSDN第9频道的视频