在命令提示符窗口中构建
点击"开始à所有程序àMicrosoft Platform SDKàOpen Build EnvironmentàWindows XP 64-bit Build EnvironmentàSet Windows XP x64 Build Environment (Retail)",此时可打开一个命令提示符窗口,已设置为Windows XP x64应用程序生成环境,在此窗口下生成的程序可运行在Windows XP x64 Edition上。如果要调用编译器,键入cl.exe,要调用链接器,键入link.exe。键入cl/?、link/? 查看详细信息。
假设前段示例代码的文件名为:first64.cpp,存放在D盘根目录下。
在命令提示符窗口中键入:cl d:\first64.cpp bufferoverflowU.lib /EHsc,回车。
此处解释一下为什么这样调用编译命令,默认情况下,cl在编译完成之后会自动调用link,命令行中带上/EHsc是为了打开"C++例外(Exceptions)",以免出现编译器警告;微软的编译器从Visual Studio.NET 2002开始,默认设置了一个编译选项/GS,其作用是堆栈检查,以防止堆栈或缓冲区溢出此类问题的发生,即是阻止代码溢出攻击,所以必须链接 bufferoverflowU.lib库。其详细情况如下:
·bufferoverflowU.lib:此函数库具体实现安全性 cookie 验证功能,此功能可以在用户模式中使用,也可以在使用 Win32 API 的应用程序中使用。大多数应用程序将链接到这个函数库。
·bufferoverflowK.lib:此函数库具体实现在操作系统内核模式中执行的安全性 cookie 检查。在内核模式中运行的服务与子系统应该链接到这个库。
·bufferoverflow.lib:此函数库具体实现可以在用户模式中使用的安全性 cookie 验证功能。不过它与 bufferoverflowU.lib 有所不同,它可以在不使用 Win32 API 的服务与应用程序中使用。
在集成开发环境中(IDE)构建
首先,点击"开始à所有程序àMicrosoft Platform SDKàOpen Build EnvironmentàWindows XP 64-bit Build EnvironmentàSet Windows XP x64 Build Environment (Retail)",它会自动设置好path、include、lib环境变量。
修改开始菜单中Visual C++ 2005 Express Edition的快捷方式,加上启动参数/useenv,如下"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\VCExpress.exe" /useenv。
此时启动Visual C++ 2005 Express Edition的集成开发环境(IDE),加载前面所创建的工程,选择"Build"à"Configuration Manager",在Active solution configrration栏中选择New…


1、 点击菜单"Project"à"Properties",打开"Configuration Properties" à"C++" à"General",确定"Detect 64-bit Portability Issues:"为"Yes(/Wp64)",以保证编译器检查工程的64位可移植性问题。
2、 打开"Configuration Properties" à"Linker" à"Input",在第一行"Additional Dependencies:"中加入bufferoverflowU.lib库。
3、 打开"Configuration Properties" à"Linker" à"Advanced",把"Target Machine"改为"Not Set";接下来点击左边的"Command Line",在"Additional options:"栏中加入"/MACHINE:AMD64"。
点击"确定"退出,接下来就可以生成工程了;如果生成过程中,提示找不到cl.exe、头文件、库等等之类的信息,可在菜单"Tools"à"Options…"à"Projects and Solutions"à"VC++ Directories"中检查有关目录是否设置正确,构建工程所需的全部相关文件都位于"C:\Program Files\Microsoft Platform SDK"下。这属于集成开发环境(IDE)的使用设置问题,不少文章都有介绍,此处不再赘述。
现在,你也可以编写64位应用程序了,是不是很简单呢;Visual C++ 2005与Platform SDK已经为64位编程做好了准备,你呢?
