In Используя заголовки 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 <windows.h>
Затем запустите:
cl /E /D_WIN32_WINNT=0x0501 /DNTDDI_VERSION=0x05010000 foo.h | grep CancelSynchronousIo
Я ожидаю, что я не получу вывод, но вместо этого определено CancelSynchronousIo.