Использование заголовков Windows

Файлы заголовков для API Windows позволяют создавать 32-разрядные и 64-разрядные приложения. Они включают объявления для версий API Юникода и ANSI. Дополнительные сведения см . в Юникоде в API Windows. Они используют типы данных, позволяющие создавать 32-разрядные и 64-разрядные версии приложения из одной базы исходного кода. Дополнительные сведения см. в статье "Подготовка к работе с 64-разрядной версией Windows". К дополнительным функциям относятся заметки заголовков и проверка типов STRICT.

Visual C++ и файлы заголовков Windows

Microsoft Visual C++ включает копии файлов заголовков Windows, которые были текущими в момент выпуска Visual C++. Таким образом, если вы устанавливаете обновленные файлы заголовков из пакета 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 "Порог 2" NTDDI_WIN10_TH2 (0x0A000001)
Windows 10 1507 "Пороговое значение" 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 с пакетом обновления 1 (SP1) NTDDI_VISTASP1 (0x06000100)
Windows Vista NTDDI_VISTA (0x06000000)
Windows Server 2003 с пакетом обновления 2 (SP2); NTDDI_WS03SP2 (0x05020200)
Windows Server 2003 с пакетом обновления 1 (SP1) NTDDI_WS03SP1 (0x05020100)
Windows Server 2003 NTDDI_WS03 (0x05020000)
Windows XP с пакетом обновления 3 (SP3) NTDDI_WINXPSP3 (0x05010300)
Windows XP с пакетом обновления 2 (SP2) NTDDI_WINXPSP2 (0x05010200)
Windows XP с пакетом обновления 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 с пакетом обновления 1 (SP1), Windows XP с пакетом обновления 2 (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 с пакетом обновления 2 (SP2) _WIN32_IE_IE60SP2 (0x0603)
Internet Explorer 6.0 с пакетом обновления 1 (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 в каждом исходном файле или указав параметр компилятора /D, поддерживаемый Visual C++.

Например, чтобы задать WINVER в исходном файле, используйте следующую инструкцию:

#define WINVER 0x0502

Чтобы задать _WIN32_WINNT в исходном файле, используйте следующую инструкцию:

#define _WIN32_WINNT 0x0502

Чтобы задать _WIN32_WINNT с помощью параметра компилятора /D, используйте следующую команду:

cl -c /D_WIN32_WINNT=0x0502 source.cpp

Сведения об использовании параметра компилятора /D см. в разделе /D (определения препроцессора).

Обратите внимание, что некоторые функции, представленные в последней версии Windows, могут быть добавлены в пакет обновления для предыдущей версии Windows. Поэтому для целевого пакета обновления может потребоваться определить _WIN32_WINNT со значением следующего основного выпуска операционной системы. Например, функция GetDllDirectory появилась в Windows Server 2003 и определяется условно, если _WIN32_WINNT 0x0502 или больше. Эта функция также добавлена в Windows XP с пакетом обновления 1 (SP1). Таким образом, если бы вы определили _WIN32_WINNT как 0x0501 для windows XP, вы пропустите функции, определенные в Windows XP с пакетом обновления 1 (SP1).

Управление упаковкой структуры

Проекты должны быть скомпилированы для использования упаковки структуры по умолчанию, которая в настоящее время составляет 8 байт, так как самый большой целочисленный тип составляет 8 байт. Это гарантирует, что все типы структуры в файлах заголовков компилируются в приложение с одинаковым выравниванием, ожидаемым API Windows. Он также гарантирует правильное выравнивание структур с 8-байтами и не приведет к сбоям выравнивания на процессорах, которые обеспечивают выравнивание данных.

Дополнительные сведения см. в разделе /Zp (выравнивание элементов структуры) или пакет.

Более быстрые сборки с меньшими файлами заголовков

Вы можете уменьшить размер файлов заголовков Windows, исключив некоторые из менее распространенных объявлений API следующим образом:

  • Определите WIN32_LEAN_AND_MEAN, чтобы исключить ТАКИЕ API, как криптография, DDE, RPC, оболочка и сокеты Windows.

    #define WIN32_LEAN_AND_MEAN

  • Определите один или несколько символов API NO, чтобы исключить API. Например, NOCOMM исключает API последовательной связи. Список символов API NOподдержки см. в разделе Windows.h.

    #define NOCOMM

Сайт скачивания пакета SDK для Windows