Подтвердить что ты не робот

Проверьте версию Windows

Как я могу проверить на С++, если версия Windows, установленная на компьютере, - Windows Vista и выше (Windows 7)?

4b9b3361

Ответ 1

Как и другие тесты для проверки версии Windows NT:

OSVERSIONINFO   vi;

memset (&vi, 0, sizeof vi);
vi .dwOSVersionInfoSize = sizeof vi;
GetVersionEx (&vi);
if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT  &&  vi.dwMajorVersion >= 6)

Ответ 2

Все ответы в этом потоке указывают на использование GetVersion или GetVersionEx для этого теста, который неверен. Кажется, это работает, но это рискованно. Основной источник проблем appcompat для обновлений ОС Windows происходит из плохо написанных тестов на основе результатов GetVersion с плохими предположениями или ошибками сравнения.

Правильный способ выполнения этого теста - использовать VerifyVersionInfo, а не GetVersion или GetVersionEx.

Если вы используете набор инструментов компилятора VS 2013 и SDK Windows 8.1, вы можете использовать VersionHelpers.h и просто вызвать IsWindowsVistaOrGreater.

Если вы используете набор инструментов платформы VS 2013 v120_xp для целевой Windows XP, вы фактически используете SDK Windows 7.1A, поэтому вам нужно напрямую использовать 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. -world, такие как IsWindowsVistaOrGreater, IsWindows7OrGreater, IsWindows7SP1OrGreater, IsWindows8OrGreater, все будут работать нормально даже без манифеста. Это только если вы используете IsWindows8Point1OrGreater или IsWindows10OrGreater, что поведение на основе манифеста даже вопросы.

См. также этот поток.

Ответ 3

Использовать функцию GetVersionEx, определенную в kernel32.dll:

bool IsWindowsVistaOrHigher() {
   OSVERSIONINFO osvi;
   ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   GetVersionEx(&osvi);
   return osvi.dwMajorVersion >= 6;
}

Ответ 4

В Visual Studio 2013 или выше вы также можете использовать новые функции Версии Версии.

Существуют методы для разных версий Windows. Пример:

#include <VersionHelpers.h>

if (!IsWindowsVistaOrGreater())
{
   MessageBox(NULL, "You need at least Windows Vista", "Version Not Supported", MB_OK);
}

Дополнительная информация здесь

Ответ 5

Я думаю, что вы ищете функцию GetVersionEx.

Ответ 6

Эта страница поддержки Microsoft содержит детали для более старых версий.

Чтобы определить операционную систему, работающую в данной системе, необходимы следующие данные:

              95  98  ME  NT 4  2000  XP
PlatformID    1   1   1   2     2     2
Major version 4   4   4   4     5     5
Minor version 0   10  90  0     0     1

Вы можете реализовать код и запустить его на машине Vista и Windows-7, чтобы проверить возвращаемые значения.

Чтобы получить информацию о версии операционной системы, выполните следующий вызов:

System::OperatingSystem *osInfo = System::Environment::OSVersion;

Ответ 7

Вы можете использовать функцию GetVersion() или GetVersionEx() в файле kernel32.dll. Эти две функции доступны только в Windows 2000 или новее.

Чтобы узнать больше об этом, посмотрите http://msdn.microsoft.com/en-us/library/ms724451%28VS.85%29.aspx.