Получение версии сборки ОС от Win32 Api C++

Я пытаюсь найти версию сборки Windows Server 2016, например RS1 или RS3. Был API для этого - GetVersionEx() - но сейчас устарела.

MSDN говорит использовать вместо этого функции поддержки версий.

Я хочу версию сборки, например: 1607 для RS1.

Есть ли API, чтобы получить это?

1 ответ

Вариант 0: (на RbMm) Используйте [RtlGetVersion] из комплекта разработки драйверов.

Вариант 1: получить номер версии системной DLL, например, kernel32.dll. MSDN благословляет этот подход.

// Quick hack without error checking.
#include <cassert>
#include <iomanip>
#include <iostream>
#include <vector>
#include <Windows.h>

int main() {
  const auto system = L"kernel32.dll";
  DWORD dummy;
  const auto cbInfo =
      ::GetFileVersionInfoSizeExW(FILE_VER_GET_NEUTRAL, system, &dummy);
  std::vector<char> buffer(cbInfo);
  ::GetFileVersionInfoExW(FILE_VER_GET_NEUTRAL, system, dummy,
                          buffer.size(), &buffer[0]);
  void *p = nullptr;
  UINT size = 0;
  ::VerQueryValueW(buffer.data(), L"\\", &p, &size);
  assert(size >= sizeof(VS_FIXEDFILEINFO));
  assert(p != nullptr);
  auto pFixed = static_cast<const VS_FIXEDFILEINFO *>(p);
  std::cout << HIWORD(pFixed->dwFileVersionMS) << '.'
            << LOWORD(pFixed->dwFileVersionMS) << '.'
            << HIWORD(pFixed->dwFileVersionLS) << '.'
            << LOWORD(pFixed->dwFileVersionLS) << '\n';

  return 0;
}

Вариант 2: запрос реестра, а именно:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

который имеет значения для CurrentMajorVersionNumber, CurrentMinorVersionNumber, а также CurrentBuildNumber,

Я не могу найти официальную документацию для этих значений, поэтому она может быть не одобрена MSDN или не предназначена для будущего.

Вариант 3. Используйте GetProductInfo, если он доступен, и используйте GetVersionInfo, если это не так.

Другие вопросы по тегам