选项 0:(按 RbMm)使用驱动程序开发工具包中的 [RtlGetVersion]。
选项 1:[更新] 获取系统 DLL 的版本号,例如 kernel32.dll。 MSDN 曾经对这种做法赞不绝口,说:
要获取操作系统的完整版本号,请在其中一个系统 DLL(例如 Kernel32.dll)上调用 GetFileVersionInfo 函数,然后调用 VerQueryValue 以获取文件版本信息的 \StringFileInfo\\ProductVersion 子块。 [来自大约 2017 年 MSDN 的 Internet Archive snapshot]
看起来像这样:
// 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
具有CurrentMajorVersionNumber、CurrentMinorVersionNumber 和CurrentBuildNumber 的值。
我找不到这些值的官方文档,因此这可能不是 MSDN 批准的或面向未来的。
选项 3:如果可用则使用 GetProductInfo,如果不可用则回退到 GetVersionInfo。