¿Visual Studio configura WINVER / _WIN32_WINNT en Windows 8 en Windows 7?

Estoy realizando algunas pruebas en Windows 7 x64 con Visual Studio 2012. Parece que la cadena de herramientas de Microsoft está configurando_WIN32_WINNT a0x602 (_WIN32_WINNT_WIN8) La ejecución de nuestro programa de prueba da como resultadoThe procedure entry point GetOverlappedResultEx could not be located in the dynamic link library KERNEL32.dll:

Tengo dos preguntas. Primero, por curiosidad mórbida, ¿por qué está configurando Microsoft?_WIN32_WINNT a un valor que no es válido para el entorno de ejecución? Puedo entender si un usuario quiere hacerlo, pero no Microsoft, ya que rompe las cosas (q.v.)

Segundo, ¿cómo establecemosWINVER o_WIN32_WINNT a la simbólica "Esta plataforma"? En este caso, "esta plataforma" es Windows 7. Cuando pruebe en Windows Vista, será una plataforma diferente. Cuando pruebe en Windows 8, será otra plataforma. Y cuando pruebe bajo el indicador de desarrollador ARM para Windows Phone y Windows Store, será otra plataforma más.

El problema es muy fácil de duplicar. Aquí están los pasos. Me imagino que cualquiera con un buen entorno de prueba ya tiene los primeros ocho pasos.

Poner de pie una máquina Windows 7, x64Parchear completamente la máquina con Windows 7Instalar Visual Studio 2008Parchear completamente Visual Studio 2008Instalar Visual Studio 2010Parchear completamente Visual Studio 2010Instalar Visual Studio 2012Parchear completamente Visual Studio 2012

Entonces:

Cree un proyecto vacío "Hello World" en VS2008Eliminartodo exceptohello_world.cpp (Esto debería dejar 1 archivo de solución y 1 archivo de proyecto, 1 archivo de origen)Conviértalo a VS2010Abrir con VS2012

Puedo publicar el MCVE, que es un archivo fuente vacío, para apaciguar a algunas personas. Parece una pérdida de tiempo ya que el problema está en la cadena de herramientas y no en el archivo fuente. Es un vaciomain realmente crucial para este problema? Lo maloWINVER y_WIN32_WINNT se establecerá independientemente de lo que haya en el archivo.

Sé el origen del error. Nuestro código cambió recientemente para mejorar el soporte paraWindows 8, Phone 8, Store 8, Server 2012, Windows 10, Phone 10, Store 10 y Windows Universal Platform. Los cambios se ven así:

#if defined(CRYPTOPP_WIN32_AVAILABLE)
# if ((WINVER >= 0x0602 /*_WIN32_WINNT_WIN8*/) || (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/))
#  include <synchapi.h>
#  include <ioapiset.h>
#  define USE_WINDOWS8_API
# endif
#endif
...

#if defined(USE_WINDOWS8_API)
    BOOL result = GetOverlappedResultEx(GetHandle(), &m_overlapped, &m_lastResult, INFINITE, FALSE);
#else
    BOOL result = GetOverlappedResult(GetHandle(), &m_overlapped, &m_lastResult, FALSE);
#endif

Irónicamente, agregamosUSE_WINDOWS8_API, el adicional incluye y las llamadas aGetOverlappedResultEx para apaciguar las herramientas en primer lugar. Se quejaban de funciones obsoletas y de compilaciones sucias. Las compilaciones sucias estaban creando problemas de gobernanza, C&A y ST&E para los usuarios.

Audité el código para asegurarme de que no estamos configurando los valores de manera involuntaria o incorrecta. Verifiqué que lo hacemos en un solo lugar, y la ruta del código no está activada porque la cadena de herramientas de Microsoft está configurando el valor en0x602:

#ifdef CRYPTOPP_WIN32_AVAILABLE
# ifndef _WIN32_WINNT
#  define _WIN32_WINNT 0x0400
# endif
#endif

Aquí hay una pregunta relacionada con el desbordamiento de pila:¿Qué es WINVER?, pero no analiza cómo configurarlo en "esta plataforma".

Aquí están los documentos de Microsoft sobre el tema:Usando los encabezados de Windows yModificando WINVER y _WIN32_WINNT. Irónicamente, en realidad no discuten el problema o Windows 10, Windows Phone 10, Windows Store 10 o Windows Universal Platform.

Por otro lado, GCC tiene un cuasi similar-march=native que básicamente proporciona "esta plataforma".

Respuestas a la pregunta(4)

Su respuesta a la pregunta