使用 Windows 标头
Windows API 的头文件让您能够创建 32 位和 64 位应用程序。 它们包括 API 的 Unicode 和 ANSI 版本的声明。 更多信息,请参阅 Windows API 中的 Unicode。 它们使用数据类型,使您能够基于单个源代码库生成应用程序的 32 位和 64 位版本。 有关详细信息,请参阅为 64 位 Windows 做好准备。 其他功能包括标头批注和 STRICT 类型检查。
Visual C++ 和 Windows 头文件
Microsoft Visual C++ 包括发布 Visual C++ 时当前 Windows 头文件的副本。 因此,如果从 SDK 安装更新的头文件,则最终可能会在计算机上安装多个版本的 Windows 头文件。 如果不确保使用的是最新版本的 SDK 头文件,则编译使用 Visual C++ 发布后引入的功能的代码时会收到以下错误代码:错误 C2065:未声明标识符。
条件声明的宏
某些依赖于特定版本的 Windows 函数使用条件代码声明。 这样,您便可以使用编译器来检测应用程序是否使用其目标版本 Windows 上不支持的函数。 若要编译使用这些函数的应用程序,必须定义相应的宏。 否则,您会收到错误消息 C2065。
Windows 头文件使用宏来指示哪些版本的 Windows 支持许多编程元素。 因此,必须定义这些宏才能使用在每个主要操作系统版本中引入的新功能。 (单个头文件可能使用不同的宏;因此,如果编译问题发生,请检查包含条件定义的头文件。)有关详细信息,请参阅 SdkDdkVer.h。
下表描述了 Windows 头文件中使用的首选宏。 如果定义 NTDDI_VERSION,还必须定义 _WIN32_WINNT。
最低系统要求 | NTDDI_VERSION 的值 |
---|---|
Windows 10 1903 "19H1" | NTDDI_WIN10_19H1 (0x0A000007) |
Windows 10 1809 "Redstone 5" | NTDDI_WIN10_RS5 (0x0A000006) |
Windows 10 1803 "Redstone 4" | NTDDI_WIN10_RS4 (0x0A000005) |
Windows 10 1709 "Redstone 3" | NTDDI_WIN10_RS3 (0x0A000004) |
Windows 10 1703 "Redstone 2" | NTDDI_WIN10_RS2 (0x0A000003) |
Windows 10 1607 "Redstone 1" | NTDDI_WIN10_RS1 (0x0A000002) |
Windows 10 1511 "Threshold 2" | NTDDI_WIN10_TH2 (0x0A000001) |
Windows 10 1507 "Threshold" | NTDDI_WIN10 (0x0A000000) |
Windows 8.1 | NTDDI_WINBLUE (0x06030000) |
Windows 8 | NTDDI_WIN8 (0x06020000) |
Windows 7 | NTDDI_WIN7 (0x06010000) |
Windows Server 2008 | NTDDI_WS08 (0x06000100) |
Windows Vista Service Pack 1 (SP1) | NTDDI_VISTASP1 (0x06000100) |
Windows Vista | NTDDI_VISTA (0x06000000) |
Windows Server 2003 Service Pack 2 (SP2) | NTDDI_WS03SP2 (0x05020200) |
带 Service Pack 1 (SP1) 的 Windows Server 2003 | NTDDI_WS03SP1 (0x05020100) |
Windows Server 2003 | NTDDI_WS03 (0x05020000) |
Windows XP Service Pack 3 (SP3) | NTDDI_WINXPSP3 (0x05010300) |
Windows XP Service Pack 2 (SP2) | NTDDI_WINXPSP2 (0x05010200) |
Windows XP Service Pack 1 (SP1) | NTDDI_WINXPSP1 (0x05010100) |
Windows XP | NTDDI_WINXP (0x05010000) |
下表描述了 Windows 头文件中使用的其他宏。
最低系统要求 | _WIN32_WINNT 和 WINVER 的最小值 |
---|---|
Windows 10 | _WIN32_WINNT_WIN10 (0x0A00) |
Windows 8.1 | _WIN32_WINNT_WINBLUE (0x0603) |
Windows 8 | _WIN32_WINNT_WIN8 (0x0602) |
Windows 7 | _WIN32_WINNT_WIN7 (0x0601) |
Windows Server 2008 | _WIN32_WINNT_WS08 (0x0600) |
Windows Vista | _WIN32_WINNT_VISTA (0x0600) |
Windows Server 2003 SP1、Windows XP SP2 | _WIN32_WINNT_WS03 (0x0502) |
Windows Server 2003、Windows XP | _WIN32_WINNT_WINXP (0x0501) |
所需的最低版本 | _WIN32_IE 的最小值 |
---|---|
Internet Explorer 11.0 | _WIN32_IE_IE110 (0x0A00) |
Internet Explorer 10.0 | _WIN32_IE_IE100 (0x0A00) |
Internet Explorer 9.0 | _WIN32_IE_IE90 (0x0900) |
Internet Explorer 8.0 | _WIN32_IE_IE80 (0x0800) |
Internet Explorer 7.0 | _WIN32_IE_IE70 (0x0700) |
Internet Explorer 6.0 SP2 | _WIN32_IE_IE60SP2 (0x0603) |
Internet Explorer 6.0 SP1 | _WIN32_IE_IE60SP1 (0x0601) |
Internet Explorer 6.0 | _WIN32_IE_IE60 (0x0600) |
Internet Explorer 5.5 | _WIN32_IE_IE55 (0x0550) |
Internet Explorer 5.01 | _WIN32_IE_IE501 (0x0501) |
Internet Explorer 5.0、5.0a、5.0b | _WIN32_IE_IE50 (0x0500) |
设置 WINVER 或 _WIN32_WINNT
可以使用每个源文件中的 #define 语句或指定 Visual C++支持的 /D 编译器选项来定义这些符号。
例如,若要在源文件中设置 WINVER,请使用以下语句:
#define WINVER 0x0502
若要在源文件中设置 _WIN32_WINNT,请使用以下语句:
#define _WIN32_WINNT 0x0502
若要使用 /D 编译器选项设置 _WIN32_WINNT,请使用以下命令:
cl -c /D_WIN32_WINNT=0x0502 source.cpp
有关使用 /D 编译器选项的信息,请参阅 /D(预处理器定义)。
请注意,最新版本的 Windows 中引入的某些功能可能会添加到早期版本的 Windows Service Pack 中。 因此,若要面向 Service Pack,可能需要使用下一个主要操作系统版本的值定义 _WIN32_WINNT。 例如,GetDllDirectory 函数是在 Windows Server 2003 中引入的,并在 _WIN32_WINNT 0x0502 或更高版本时有条件地定义。 此函数也已添加到 Windows XP SP1。 因此,如果要将 _WIN32_WINNT 定义为面向 Windows XP 的 0x0501,则会错过使用 Windows XP SP1 中定义的功能。
控制结构打包
应编译项目以使用默认结构打包,当前为 8 个字节,因为最大的整型类型为 8 个字节。 这样做可以确保头文件中的所有结构类型都能以 Windows API 所期望的对齐方式编译到应用程序中。 它还可确保具有 8 字节值的结构正确对齐,并且不会在强制实施数据对齐的处理器上导致对齐错误。
有关详细信息,请参阅 /Zp(结构成员对齐)或 pack。
使用较小的头文件加快生成
可以通过排除一些不太常见的 API 声明来减少 Windows 头文件的大小,如下所示:
定义 WIN32_LEAN_AND_MEAN 以排除加密、DDE、RPC、Shell 和 Windows 套接字等 API。
#define WIN32_LEAN_AND_MEAN
定义一个或多个 NOapi 符号以排除该 API。 例如,NOCOMM 排除串行通信 API。 有关支持 NOapi 符号的列表,请参阅 Windows.h。
#define NOCOMM
相关主题