En Using the Windows Headers, Microsoft afirma que _WIN32_WINNT y NTDDI_VERSION se pueden usar para evitar la definición de funciones API para las versiones más nuevas de Windows. Sin embargo, esto no parece ser universalmente cierto.¿Qué pasó con las protecciones WINVER y _WIN32_WINNT en windows.h?
Por ejemplo, CancelSynchronousIo requiere Vista o posterior, pero no está protegido en absoluto en las dos versiones de Windows SDK que tengo (v6.0 y v7.1).
WINBASEAPI
BOOL
WINAPI
CancelIoEx(
__in HANDLE hFile,
__in_opt LPOVERLAPPED lpOverlapped
);
Mientras tanto, GetVolumeInformationByHandleW, que también requiere Vista, esté vigilado como era de esperar:
#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 */
¿Este tipo de cosas sólo un error? ¿Son _WIN32_WINT guardias inútiles? ¿Alguien puede recomendar una forma confiable de determinar qué versión de Windows introdujo qué funciones API?
Editado para añadir:
Aquí es una prueba. foo.h contiene:
#include <windows.h>
A continuación, ejecute:
cl /E /D_WIN32_WINNT=0x0501 /DNTDDI_VERSION=0x05010000 foo.h | grep CancelSynchronousIo
Mi expectativa es que me gustaría conseguir ninguna salida, pero en su lugar se define CancelSynchronousIo.
Uso MSDN. Proporcionaré el enlace, pero veo que ya lo has hecho. Específicamente, la sección "Requisitos", donde da el "Cliente mínimo soportado" y el "Servidor mínimo soportado". También es de interés: [¿Cuál es la diferencia entre WINVER, _WIN32_WINNT, _WIN32_WINDOWS y _WIN32_IE?] (Http://blogs.msdn.com/b/oldnewthing/archive/2007/04/11/2079137.aspx). –