Имена Version-Independent МПП и выбор конкретных версий Windows
Во многих случаях API платформы фильтрации Windows (ВПП) предоставляет несколько версий функции или структуры.
Большинство имен данных и функций в API МПП заканчиваются номером версии, например "0" или "1", даже если существует только одна версия.
Сопоставление версий в fwpvi.h
Файл заголовка fwpvi.h включается начиная с пакета SDK для Windows 7 и WDK. Этот файл заголовка сопоставляет имя API без версии с версией, подходящей для использования с заданной операционной системой.
Например, ниже приведен краткий фрагмент из версии fwpvi.h, включенной в пакет SDK для Windows 8.
#define FwpmNetEventCreateEnumHandle FwpmNetEventCreateEnumHandle0
#if (NTDDI_VERSION >= NTDDI_WIN8)
#define FwpmNetEventEnum FwpmNetEventEnum2
#elif (NTDDI_VERSION >= NTDDI_WIN7)
#define FwpmNetEventEnum FwpmNetEventEnum1
#else
#define FwpmNetEventEnum FwpmNetEventEnum0
#endif
Как показано выше, существует только одна версия FwpmNetEventCreateEnumHandle — FwpmNetEventCreateEnumHandle0 , поэтому любой вызов FwpmNetEventCreateEnumHandle всегда вызывает FwpmNetEventCreateEnumHandle0, независимо от целевой операционной системы.
Однако существует три версии FwpmNetEventEnum: FwpmNetEventEnum0, FwpmNetEventEnum1 и FwpmNetEventEnum2. Файл заголовка fwpvi.h гарантирует, что вызов FwpmNetEventEnum вызовет версию, наиболее подходящую для целевой операционной системы:
- FwpmNetEventEnum2 для Windows 8 (или более поздней версии)
- Целевой объект FwpmNetEventEnum1 для Windows 7
- FwpmNetEventEnum0 для более ранних операционных систем (например, Windows Vista или Windows Vista с пакетом обновления 1 (SP1))
Вызов функций и структур Version-Independent
Разработчикам ВПП, предназначенным для конкретной операционной системы или версии WDK, рекомендуется всегда программировать на основе независимых от версии макросов. Будет автоматически выбрана последняя версия, поддерживаемая в целевой операционной системе. Рекомендуется использовать самые последние файлы заголовков, даже если они предназначены для более ранней операционной системы. Последовательное выполнение этого действия обеспечит использование последней поддерживаемой версии, а также упростит обслуживание и обновление кода.
В справочной документации по API ВПП описана каждая версия нумерованного API. Если существует несколько версий, указывается целевая операционная система. Однако разработчики, как правило, хотят вызывать независимые от версии API и указывать целевую операционную систему (например, NTDDI_WIN6 для Windows Vista или NTDDI_WIN8 для Windows 8).
Чтобы обеспечить правильную обработку функций, которые принимают различные параметры в разных версиях, можно включить условные блоки, такие как #if (NTDDI_VERSION >= NTDDI_WIN7)
.