更新 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 头文件。