2011-01-22 13 views
8

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.

+1

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). –

Respuesta

7

Es un error. Ejemplos de referencia are here y here. Alguna evidencia secundaria de que el proyecto Longhorn fue de hecho muy problemático. El equipo de Windows no recibe comentarios como DevDiv, es difícil solucionar los errores. Puede dejar una anotación en la parte inferior de la página de MSDN Library.

+3

Así que decidí hacer un pequeño experimento. Hay * cientos * de funciones incorrectamente guardadas exportadas desde kernel32. Detalles: http://www.kndr.org/windows-sdk-brokenness –

+0

Este problema se aplica no solo a las funciones importadas de 'kernel32.dll', sino que también lo encontré en los métodos' Perf * 'de' advapi32. dll'. – nothrow