Проверьте версию Windows - PullRequest
       14

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

27 голосов
/ 26 декабря 2009

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

Ответы [ 7 ]

27 голосов
/ 06 декабря 2014

Все ответы в этой теме указывают на то, что вы используете 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, то поведение, основанное на манифесте даже имеет значение.

См. Также этот поток переполнения стека.

20 голосов
/ 26 декабря 2009

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

bool IsWindowsVistaOrHigher() {
   OSVERSIONINFO osvi;
   ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   GetVersionEx(&osvi);
   return osvi.dwMajorVersion >= 6;
}
17 голосов
/ 26 декабря 2009

Аналогично другим тестам для проверки версии 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)
12 голосов
/ 12 февраля 2014

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

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

#include <VersionHelpers.h>

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

Подробнее здесь

6 голосов
/ 26 декабря 2009

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

3 голосов
/ 26 декабря 2009

На этой странице поддержки 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;
1 голос
/ 26 декабря 2009

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

Чтобы узнать больше об этом взгляде на http://msdn.microsoft.com/en-us/library/ms724451%28VS.85%29.aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...