从Win32 Api C ++获取OS构建版本

ano*_*non 2 c++ windows winapi operating-system

我试图找到Windows Server 2016计算机的生成版本,例如RS1或RS3。有一个API可以执行此操作GetVersionEx()--但现在已弃用。

MSDN表示改用版本帮助器功能

我想要构建版本,例如:RS1的1607。

是否有API可以做到这一点?

Adr*_*thy 5

选项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;
}
Run Code Online (Sandbox Code Playgroud)

选项2:查询注册表,特别是:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
Run Code Online (Sandbox Code Playgroud)

其具有用于值CurrentMajorVersionNumberCurrentMinorVersionNumberCurrentBuildNumber

我找不到有关这些值的官方文档,因此这可能不是MSDN批准的或过时的。

选项3:使用GetProductInfo(如果可用),如果不可用,则使用GetVersionInfo。

  • @ zett42-否,`RtlGetVersion`,直到始终返回真实的Windows版本,并且不查找清单 (2认同)