Visual Studio устанавливает WINVER / _WIN32_WINNT для Windows 8 в Windows 7?

Я провожу некоторое тестирование на Windows 7 x64 с использованием Visual Studio 2012. Похоже, что Microsoft Toolchain настраивает_WIN32_WINNT в0x602 (_WIN32_WINNT_WIN8). Результаты нашей тестовой программы вThe procedure entry point GetOverlappedResultEx could not be located in the dynamic link library KERNEL32.dll:

У меня два вопроса. Во-первых, из болезненного любопытства, почему настройки Microsoft_WIN32_WINNT к значению, которое не подходит для среды выполнения? Я могу понять, если пользователь хочет сделать это, но не Microsoft, так как это ломает вещи (г.о.).

Во-вторых, как мы устанавливаемWINVER или же_WIN32_WINNT к символической "Эта платформа"? В данном случае «эта платформа» - Windows 7. Когда я тестирую на Windows Vista, это будет другая платформа. Когда я тестирую на Windows 8, это будет другая платформа. И когда я тестирую под приглашением разработчика ARM для Windows Phone и Windows Store, это будет еще одна платформа.

Проблема очень легко дублируется. Вот шаги. Я предполагаю, что у любого с хорошей средой тестирования уже есть первые восемь шагов.

Встаньте на Windows 7, x64 машинаПолностью исправьте машину Windows 7Установите Visual Studio 2008Полностью патч Visual Studio 2008Установите Visual Studio 2010Полностью патч Visual Studio 2010Установите Visual Studio 2012Полностью патч Visual Studio 2012

Затем:

Создайте пустой проект "Hello World" под VS2008удалятьвсе Кромеhello_world.cpp (это должно оставить 1 файл решения и 1 файл проекта, 1 исходный файл)Преобразовать его в VS2010Открыть с VS2012

Я могу опубликовать MCVE, который является пустым исходным файлом, чтобы успокоить некоторых людей. Это кажется пустой тратой времени, поскольку проблема связана с цепочкой инструментов, а не с исходным файлом. Пустойmain действительно важно для этой проблемы? НеправильноWINVER а также_WIN32_WINNT будет установлен независимо от того, что находится в файле.

Я знаю причину ошибки. Наш код недавно изменился, чтобы улучшить поддержкуWindows 8, Phone 8, Store 8, Server 2012, Windows 10, Phone 10, Store 10 и универсальная платформа Windows, Изменения выглядят так:

#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

Как ни странно, мы добавилиUSE_WINDOWS8_API, дополнительные включает в себя и звонки наGetOverlappedResultEx чтобы успокоить инструменты в первую очередь. Они жаловались на устаревшие функции и приводили к грязным компиляциям. Грязные компиляции создавали проблемы управления, C & A и ST & E для пользователей.

Я проверил код, чтобы убедиться, что мы не случайно или неправильно устанавливаем значения. Я проверил, что мы делаем это в одном месте, и путь к коду не активирован, потому что набор инструментов Microsoft устанавливает значение0x602:

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

Вот связанный вопрос переполнения стека:Что такое WINVER?, но он не обсуждает, как установить его на «эту платформу».

Вот документы Microsoft на эту тему:Использование заголовков Windows а такжеИзменение WINVER и _WIN32_WINNT, По иронии судьбы, они на самом деле не обсуждают проблему или Windows 10, Windows Phone 10, Windows Store 10 или Windows Universal Platform.

Кроме того, GCC имеет квази-подобный-march=native это в основном обеспечивает "эту платформу".

Ответы на вопрос(4)

Ваш ответ на вопрос