Что случилось с охранниками WINVER и _WIN32_WINNT в windows.h?

В Использование заголовков Windows Microsoft утверждает, что _WIN32_WINNT и NTDDI_VERSION могут использоваться для предотвращения определения функций API для более новых версий Windows. Однако это не кажется универсальной истиной.

Например, CancelSynchronousIo требует Vista или более поздней версии, но это совсем не защищено в двух версиях Windows SDK, которые у меня есть (v6. 0 и v7.1).

WINBASEAPI
BOOL
WINAPI
CancelIoEx(
    __in HANDLE hFile,
    __in_opt LPOVERLAPPED lpOverlapped
    );

Между тем, GetVolumeInformationByHandleW , который также требует Vista, охраняется, как и следовало ожидать:

#if(_WIN32_WINNT >= 0x0600)
WINBASEAPI
BOOL
WINAPI
GetVolumeInformationByHandleW(
    __in      HANDLE hFile,
    __out_ecount_opt(nVolumeNameSize) LPWSTR lpVolumeNameBuffer,
    __in      DWORD nVolumeNameSize,
    __out_opt LPDWORD lpVolumeSerialNumber,
    __out_opt LPDWORD lpMaximumComponentLength,
    __out_opt LPDWORD lpFileSystemFlags,
    __out_ecount_opt(nFileSystemNameSize) LPWSTR lpFileSystemNameBuffer,
    __in      DWORD nFileSystemNameSize
    );
#endif /* _WIN32_WINNT >=  0x0600 */

Это просто ошибка? Бесполезны ли охранники _WIN32_WINT? Может ли кто-нибудь порекомендовать надежный способ определить, какая версия Windows представила какие функции API?

Отредактировано для добавления:

Вот тест. foo.h содержит:

#include 

Затем запустите:

cl /E /D_WIN32_WINNT=0x0501 /DNTDDI_VERSION=0x05010000 foo.h | grep CancelSynchronousIo

Я ожидаю, что я не получу вывода, но вместо этого определяется CancelSynchronousIo.

8
задан Ross Kinder 22 January 2011 в 18:04
поделиться