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

Как определить версию Windows в будущем режиме

Я заметил, что GetVersionEx() объявляется устаревшим. Хуже того, для Windows 8.1 (и предположительно будущих выпусков) номер версии ограничен манифестом приложения.

Моя цель - собрать аналитику в операционных системах, на которых работают пользователи, поэтому я могу соответствующим образом настроить таргетинг на поддержку. Мне хотелось бы найти будущее решение для сбора этих данных. Обновление манифеста не будет работать, потому что я могу только обновить манифест для версий Windows, которые уже были выпущены, а не для будущих версий. Предлагаемый API замены, вспомогательные функции версии, бесполезен.

Как я могу получить фактический номер версии Windows?

Чтобы уточнить: "Будущая проверка", я имею в виду, что я хочу что-то, у которого есть достаточно хорошие шансы работать над следующей версией Windows. Нет ничего определенного, но документы говорят, что GetVersionEx() не будет работать.

4b9b3361

Ответ 1

MSDN имеет пример, показывающий, как использовать вспомогательные функции версии (бесполезные для вашего сценария), но во введении есть следующее:

Чтобы получить полный номер версии для операционной системы, вызовите функцию GetFileVersionInfo в одной из системных DLL, например Kernel32.dll, затем вызовите VerQueryValue для получения подблока \StringFileInfo\\ProductVersion информации о версии файла.

Как сейчас, ни функция GetFileVersionInfo, ни VerQueryValue устарели.

Пример

Это извлечет версию продукта из kernel32.dll и напечатает ее на консоли:

#pragma comment(lib, "version.lib")

static const wchar_t kernel32[] = L"\\kernel32.dll";
wchar_t *path = NULL;
void *ver = NULL, *block;
UINT n;
BOOL r;
DWORD versz, blocksz;
VS_FIXEDFILEINFO *vinfo;

path = malloc(sizeof(*path) * MAX_PATH);
if (!path)
    abort();

n = GetSystemDirectory(path, MAX_PATH);
if (n >= MAX_PATH || n == 0 ||
    n > MAX_PATH - sizeof(kernel32) / sizeof(*kernel32))
    abort();
memcpy(path + n, kernel32, sizeof(kernel32));

versz = GetFileVersionInfoSize(path, NULL);
if (versz == 0)
    abort();
ver = malloc(versz);
if (!ver)
    abort();
r = GetFileVersionInfo(path, 0, versz, ver);
if (!r)
    abort();
r = VerQueryValue(ver, L"\\", &block, &blocksz);
if (!r || blocksz < sizeof(VS_FIXEDFILEINFO))
    abort();
vinfo = (VS_FIXEDFILEINFO *) block;
printf(
    "Windows version: %d.%d.%d",
    (int) HIWORD(vinfo->dwProductVersionMS),
    (int) LOWORD(vinfo->dwProductVersionMS),
    (int) HIWORD(vinfo->dwProductVersionLS));
free(path);
free(ver);