Все ответы в этой теме указывают на то, что вы используете GetVersion
или GetVersionEx
для этого теста, что неверно . Вроде работает, но это рискованно. Основным источником проблем с appcompat для обновлений ОС Windows являются плохо написанные тесты, основанные на результатах GetVersion
с неверными предположениями или ошибочными сравнениями.
Правильный способ сделать это испытание - использовать VerifyVersionInfo
, а не GetVersion
или GetVersionEx
.
Если вы используете набор инструментов компилятора VS 2013 и Windows 8.1 SDK, вы можете использовать VersionHelpers.h
и просто позвонить IsWindowsVistaOrGreater
.
Если вы используете набор инструментов платформы VS 2013 v120_xp
для работы с Windows XP, вы на самом деле используете Windows 7.1A SDK, поэтому вам необходимо использовать VeriyVersionInfo
напрямую.
В противном случае используйте:
bool IsWindowsVistaOrGreater()
{
OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
DWORDLONG const dwlConditionMask = VerSetConditionMask(
VerSetConditionMask(
VerSetConditionMask(
0, VER_MAJORVERSION, VER_GREATER_EQUAL),
VER_MINORVERSION, VER_GREATER_EQUAL),
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_VISTA);
osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_VISTA);
osvi.wServicePackMajor = 0;
return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}
Этот код будет работать в Windows 2000 или более поздней версии и даст вам надежный результат. Если вам действительно нужен этот тест для запуска в Windows 98 или Windows ME - и вы используете набор инструментов компилятора, достаточно старый для того, чтобы фактически работать на этой платформе, вы бы провели такой же тест, но с явным, а не неявным связыванием. Что в номере версии?
Кроме того, при использовании GetVersion
или GetVersionEx
по умолчанию будет получена неправильная версия в Windows 8.1 и Windows 10. См. Manifest Madness .
Обратите внимание, что в Windows 10 VerifyVersionInfo
также применяется то же поведение на основе манифеста (то есть без элемента GUID для Windows 10 VVI действует так, как будто номер версии ОС равен 6.2, а не 10.0). -миры мира, такие как IsWindowsVistaOrGreater
, IsWindows7OrGreater
, IsWindows7SP1OrGreater
, IsWindows8OrGreater
, будут работать нормально, даже без манифеста. Только если вы используете IsWindows8Point1OrGreater
или IsWindows10OrGreater
, то поведение, основанное на манифесте даже имеет значение.
См. Также этот поток переполнения стека.