gpt4 book ai didi

c++ - 从 Win32 Api C++ 获取操作系统构建版本

转载 作者:可可西里 更新时间:2023-11-01 09:50:53 32 4
gpt4 key购买 nike

我正在尝试查找 Windows Server 2016 机器的构建版本,例如 RS1 或 RS3。有一个 API 可以执行此操作 - GetVersionEx() - 但现在已弃用。

MSDN 说使用 Version Helper Functions相反。

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

是否有 API 来获取此信息?

最佳答案

选项 0:(根据 RbMm)使用驱动程序开发工具包中的 [RtlGetVersion]。

选项 1:[已更新] 获取系统 DLL(如 kernel32.dll)的版本号。 MSDN 曾经赞扬这种方法,说:

To obtain the full version number for the operating system, call the GetFileVersionInfo function on one of the system DLLs, such as Kernel32.dll, then call VerQueryValue to obtain the \StringFileInfo\\ProductVersion subblock of the file version information. [From an Internet Archive snapshot of MSDN circa 2017]

看起来像这样:

// 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;
}

请注意 original MSDN link现在重定向到未提及此方法的较新文档集。我想这意味着这不再是受支持的技术,而且据推测,旧代码的所有兼容性黑客可能会阻止应用程序获得实际答案。

方案二:查询注册表,具体为:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

它具有 CurrentMajorVersionNumberCurrentMinorVersionNumberCurrentBuildNumber 的值。

我找不到这些值的官方文档,因此这可能不是 MSDN 批准的或面向 future 的。

选项 3:使用 GetProductInfo如果可用,如果不可用,则回退到 GetVersionInfo。

关于c++ - 从 Win32 Api C++ 获取操作系统构建版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47581146/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com