Имена 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

Как показано выше, существует только одна версия FwpmNetEventCreateEnumHandleFwpmNetEventCreateEnumHandle0 , поэтому любой вызов FwpmNetEventCreateEnumHandle всегда вызывает FwpmNetEventCreateEnumHandle0, независимо от целевой операционной системы.

Однако существует три версии FwpmNetEventEnum: FwpmNetEventEnum0, FwpmNetEventEnum1 и FwpmNetEventEnum2. Файл заголовка fwpvi.h гарантирует, что вызов FwpmNetEventEnum вызовет версию, наиболее подходящую для целевой операционной системы:

Вызов функций и структур Version-Independent

Разработчикам ВПП, предназначенным для конкретной операционной системы или версии WDK, рекомендуется всегда программировать на основе независимых от версии макросов. Будет автоматически выбрана последняя версия, поддерживаемая в целевой операционной системе. Рекомендуется использовать самые последние файлы заголовков, даже если они предназначены для более ранней операционной системы. Последовательное выполнение этого действия обеспечит использование последней поддерживаемой версии, а также упростит обслуживание и обновление кода.

В справочной документации по API ВПП описана каждая версия нумерованного API. Если существует несколько версий, указывается целевая операционная система. Однако разработчики, как правило, хотят вызывать независимые от версии API и указывать целевую операционную систему (например, NTDDI_WIN6 для Windows Vista или NTDDI_WIN8 для Windows 8).

Чтобы обеспечить правильную обработку функций, которые принимают различные параметры в разных версиях, можно включить условные блоки, такие как #if (NTDDI_VERSION >= NTDDI_WIN7).