更新 WINVER 和 _WIN32_WINNT

使用 Windows SDK 时,可以指定代码可以运行的 Windows 版本。 预处理器宏 WINVER 和 _WIN32_WINNT 指定代码支持的最低操作系统版本。 Visual Studio 和 Microsoft C++ 编译器支持面向 Windows 7 SP1 及更高版本。 较旧的工具集包括对 Windows XP SP2、Windows Server 2003 SP1、Vista 和 Windows Server 2008 的支持。 不支持 Windows 95、Windows 98、Windows ME、Windows NT 和 Windows 2000。

升级较旧的项目时,可能需要更新 WINVER 或 _WIN32_WINNT 宏。 如果它们被分配了不支持的 Windows 版本的值,你可能会看到与这些宏相关的编译错误。

备注

若要修改这些宏,请在头文件(例如在面向 Windows 的某些项目目标所包含的 targetver.h)中添加以下行。

#define WINVER 0x0A00
#define _WIN32_WINNT 0x0A00

示例中的宏设置为面向 Windows 10 操作系统的每个版本。 在 Windows 头文件 sdkddkver.h(定义每个主 Windows 版本的宏)中列出了可能的值。 若要生成应用程序以支持以前的 Windows 平台,请包括 WinSDKVer.h。 然后,在包括 sdkddkver.h 之前,将 WINVER 和 _WIN32_WINNT 宏设置为最早支持的平台。 下面是 Windows 10 SDK 版 sdkddkver.h(它对每个主版本的 Windows 的值进行编码)中的行:

//
// _WIN32_WINNT version constants
//
#define _WIN32_WINNT_NT4                    0x0400 // Windows NT 4.0
#define _WIN32_WINNT_WIN2K                  0x0500 // Windows 2000
#define _WIN32_WINNT_WINXP                  0x0501 // Windows XP
#define _WIN32_WINNT_WS03                   0x0502 // Windows Server 2003
#define _WIN32_WINNT_WIN6                   0x0600 // Windows Vista
#define _WIN32_WINNT_VISTA                  0x0600 // Windows Vista
#define _WIN32_WINNT_WS08                   0x0600 // Windows Server 2008
#define _WIN32_WINNT_LONGHORN               0x0600 // Windows Vista
#define _WIN32_WINNT_WIN7                   0x0601 // Windows 7
#define _WIN32_WINNT_WIN8                   0x0602 // Windows 8
#define _WIN32_WINNT_WINBLUE                0x0603 // Windows 8.1
#define _WIN32_WINNT_WINTHRESHOLD           0x0A00 // Windows 10
#define _WIN32_WINNT_WIN10                  0x0A00 // Windows 10
// . . .

如果需要更精细的版本控制方法,可以在 sdkddkver.h 中使用 NTDDI 版本常量。 下面是 sdkddkver.h 在 Windows 10 SDK 版本 10.0.18362.0 中定义的一些宏:

//
// NTDDI version constants
//
#define NTDDI_WIN7                          0x06010000
#define NTDDI_WIN8                          0x06020000
#define NTDDI_WINBLUE                       0x06030000
#define NTDDI_WINTHRESHOLD                  0x0A000000  /* ABRACADABRA_THRESHOLD */
#define NTDDI_WIN10                         0x0A000000  /* ABRACADABRA_THRESHOLD */
#define NTDDI_WIN10_TH2                     0x0A000001  /* ABRACADABRA_WIN10_TH2 */
#define NTDDI_WIN10_RS1                     0x0A000002  /* ABRACADABRA_WIN10_RS1 */
#define NTDDI_WIN10_RS2                     0x0A000003  /* ABRACADABRA_WIN10_RS2 */
#define NTDDI_WIN10_RS3                     0x0A000004  /* ABRACADABRA_WIN10_RS3 */
#define NTDDI_WIN10_RS4                     0x0A000005  /* ABRACADABRA_WIN10_RS4 */
#define NTDDI_WIN10_RS5                     0x0A000006  /* ABRACADABRA_WIN10_RS5 */
#define NTDDI_WIN10_19H1                    0x0A000007  /* ABRACADABRA_WIN10_19H1*/

#define WDK_NTDDI_VERSION                   NTDDI_WIN10_19H1 /* ABRACADABRA_WIN10_19H1 */

//
// masks for version macros
//
#define OSVERSION_MASK      0xFFFF0000
#define SPVERSION_MASK      0x0000FF00
#define SUBVERSION_MASK     0x000000FF

//
// macros to extract various version fields from the NTDDI version
//
#define OSVER(Version)  ((Version) & OSVERSION_MASK)
#define SPVER(Version)  (((Version) & SPVERSION_MASK) >> 8)
#define SUBVER(Version) (((Version) & SUBVERSION_MASK) )

可以在代码中使用 OSVER、SPVER 和 SUBVER 宏来控制不同级别的 API 支持的条件编译。

你查看的 sdkddkver.h 中可能没有列出以上所有 Windows 版本。 这意味着你很可能正在使用 Windows SDK 的较旧版本。 (如果你看到更多,则可能正在查看更新版本的 SDK。)默认情况下,Visual Studio 中的新 Windows 项目使用 Visual Studio 附带的最新 Windows SDK。 若要使用已单独安装的较新的 SDK,必须在项目属性中显式设置 Windows SDK。

注意

如果将内部 MFC 头文件包含到应用程序中,则无法保证这些值有效。

你还可以使用 /D 编译器选项定义此宏。 有关详细信息,请参阅 /D (Preprocessor Definitions)

若要深入了解这些宏的含义,请参阅 使用 Windows 头文件

另请参阅

Visual C++ 更改历史记录