Поделиться через


Обновление WINVER и _WIN32_WINNT

При использовании пакета SDK для Windows можно указать, какие версии Windows можно запустить в коде. Макросы препроцессора WINVER и _WIN32_WINNT указать минимальную версию операционной системы, поддерживаемый кодом. Visual Studio и компилятор Microsoft C++ поддерживают использование Windows 7 с пакетом обновления 1 (SP1) и более поздних версий. Более старые наборы инструментов включают поддержку Windows XP с пакетом обновления 2 (SP2), Windows Server 2003 с пакетом обновления 1 (SP1), Vista и Windows Server 2008. Windows 95, Windows 98, Windows ME, Windows NT и Windows 2000 не поддерживаются.

При обновлении старого проекта может потребоваться обновить макросы WINVER или _WIN32_WINNT . Если они назначены значения для неподдерживаемой версии Windows, могут появиться ошибки компиляции, связанные с этими макросами.

Замечания

Чтобы изменить макросы, в файле заголовка (например, в targetver.h, который включается в некоторые шаблоны проектов, предназначенные для Windows), добавьте следующие строки.

#define WINVER 0x0A00
#define _WIN32_WINNT 0x0A00

Макросы в примере предназначены для каждой версии операционной системы Windows 10. Возможные значения перечислены в файле заголовка Windows sdkddkver.h, который определяет макросы для каждой основной версии Windows. Чтобы создать приложение для поддержки предыдущей платформы Windows, включите WinSDKVer.h. Затем задайте для макросов WINVER и _WIN32_WINNT старую поддерживаемую платформу, прежде чем включить sdkddkver.h. Ниже приведены строки из версии пакета SDK для Windows 10 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
// . . .

Для более точного подхода к использованию версий можно использовать константы версий NTDDI в sdkddkver.h. Ниже приведены некоторые макросы, определенные пакетом sdkddkver.h в пакете SDK для Windows 10 версии 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.

Вы можете не видеть все эти версии Windows, перечисленные в пакете sdkddkver.h , на который вы смотрите. Это означает, что вы, вероятно, используете старую версию пакета SDK для Windows. (Если вы видите больше, вы, вероятно, просматриваете более новую версию пакета SDK.) По умолчанию новые проекты Windows в Visual Studio используют последний пакет SDK для Windows, который поставляется с Visual Studio. Чтобы использовать более новый пакет SDK, который вы установили отдельно, необходимо явно задать пакет SDK для Windows в свойствах проекта.

Примечание.

Значения могут не сработать, если включить в приложение внутренние заголовки MFC.

Также можно определить этот макрос с помощью параметра компилятора /D. Для получения дополнительной информации см. /D (Preprocessor Definitions).

Дополнительные сведения о значении этих макросов см. в разделе Использование заголовков Windows.

См. также

Журнал изменений Visual C++