Visual Studio definindo WINVER / _WIN32_WINNT para Windows 8 no Windows 7?

Estou realizando alguns testes no Windows 7 x64 usando o Visual Studio 2012. Parece que a cadeia de ferramentas da Microsoft está definindo_WIN32_WINNT para0x602 (_WIN32_WINNT_WIN8) A execução dos resultados do nosso programa de teste emThe procedure entry point GetOverlappedResultEx could not be located in the dynamic link library KERNEL32.dll:

Eu tenho duas perguntas. Primeiro, por curiosidade mórbida, por que a Microsoft está definindo_WIN32_WINNT para um valor que não é válido para o ambiente de execução? Entendo se um usuário deseja fazer isso, mas não a Microsoft, pois quebra as coisas (q.v.)

Segundo, como estabelecemosWINVER ou_WIN32_WINNT para o simbólico "Esta plataforma"? Nesse caso, "esta plataforma" é o Windows 7. Quando eu testo no Windows Vista, será uma plataforma diferente. Quando eu testo no Windows 8, será outra plataforma. E quando eu testo no prompt do desenvolvedor do ARM para Windows Phone e Windows Store, será mais uma plataforma.

O problema é muito fácil de duplicar. Aqui estão os passos. Imagino que qualquer pessoa com um bom ambiente de teste já tenha os oito primeiros passos.

Levante uma máquina Windows 7, x64Aplique um patch completo à máquina Windows 7Instale o Visual Studio 2008Patch completo do Visual Studio 2008Instale o Visual Studio 2010Patch completamente do Visual Studio 2010Instale o Visual Studio 2012Patch totalmente do Visual Studio 2012

Então:

Crie um projeto "Hello World" vazio no VS2008Excluirtudo excetohello_world.cpp (isso deve deixar 1 arquivo de solução e 1 arquivo de projeto, 1 arquivo de origem)Converta-o para VS2010Abrir com o VS2012

Posso postar o MCVE, que é um arquivo de origem vazio, para apaziguar algumas pessoas. Parece uma perda de tempo, pois o problema está na cadeia de ferramentas e não no arquivo de origem. Está vaziomain realmente crucial para esse problema? O erradoWINVER e_WIN32_WINNT será definido independentemente do conteúdo do arquivo.

Eu sei a origem do erro. Nosso código foi alterado recentemente para melhor suporte paraWindows 8, Telefone 8, Loja 8, Servidor 2012, Windows 10, Telefone 10, Loja 10 e Plataforma Universal do Windows. As alterações são assim:

#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

Ironicamente, adicionamosUSE_WINDOWS8_API, as inclusões adicionais e as chamadas paraGetOverlappedResultEx para apaziguar as ferramentas em primeiro lugar. Eles estavam reclamando de funções obsoletas e causando compilações sujas. As compilações sujas estavam criando problemas de governança, C&A e ST&E para os usuários.

Eu auditei o código para garantir que não estamos definindo os valores de maneira não intencional ou incorreta. Eu verifiquei que fazemos isso em um só lugar, e o caminho do código não está ativado porque a cadeia de ferramentas da Microsoft está definindo o valor como0x602:

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

Aqui está uma pergunta relacionada ao estouro de pilha:O que é o WINVER?, mas ele não discute como defini-lo como "esta plataforma".

Aqui estão os documentos da Microsoft sobre o assunto:Usando os cabeçalhos do Windows eModificando WINVER e _WIN32_WINNT. Ironicamente, eles realmente não discutem o problema ou o Windows 10, Windows Phone 10, Windows Store 10 ou Windows Universal Platform.

Como um aparte, o GCC tem um quase-semelhante-march=native que basicamente fornece "esta plataforma".

questionAnswers(4)

yourAnswerToTheQuestion