代码:
std::map<CString, CString> mapWindowsVersions
{
{ L"22631", L"23H2" },
{ L"22621", L"22H2" },
{ L"22000", L"21H2" },
{ L"19044", L"21H2" },
{ L"19043", L"21H1" },
{ L"19042", L"20H2" },
{ L"19041", L"2004" },
{ L"18363", L"1909" },
{ L"18362", L"1903" },
{ L"17763", L"1809" },
{ L"17134", L"1803" },
{ L"16299", L"1709" }
};
VARIANT vtProp{};
hres = pclsObj->Get(L"BuildNumber", 0, &vtProp, 0, 0);
strSystemInfo.AppendFormat(L" Build Number: %s\r\n", mapWindowsVersions[vtProp.bstrVal]);
VariantClear(&vtProp);
这有效。,我从这里收集了发布描述。但是有没有内置的方法来获取这个描述,例如:23H2?
我不知道答案,但我知道从哪里开始寻找:
winver.exe
。
这是我的关于 Windows 对话框,它忠实地显示了您要查找的“版本 22H2”字符串:
winver.exe
显示 winver.exe
只是调用 Shell32.dll!ShellAboutW
来完成所有实际工作。AboutDlgProc
设置对话框资源来驱动 关于 Windows 对话框。_InitAboutDlg
将数据(字符串、文本等)加载到对话框的标签/占位符中。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
注册表项,然后根据某些任意 业务规则提取值:
EnableH2UIVersioning
的(WinRT?C++/CX?)API 控制是否显示“22H2”样式的版本名称。当这是 true
时,“22H2”字符串来自 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DisplayVersion
,否则使用 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseId
。DisplayVersion
和ReleaseId
都存在,但ReleaseId
包含错误/旧值“2009” - 这意味着ReleaseId
如果存在则不可信。根据评论中的建议,我提出了以下解决方案:
hres = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0);
strSystemInfo.AppendFormat(L" Edition: %s\r\n", vtProp.bstrVal);
VariantClear(&vtProp);
hres = pclsObj->Get(L"Version", 0, &vtProp, 0, 0);
strSystemInfo.AppendFormat(L" Version: %s\r\n", vtProp.bstrVal);
VariantClear(&vtProp);
hres = pclsObj->Get(L"BuildNumber", 0, &vtProp, 0, 0);
strSystemInfo.AppendFormat(L" Version Build Number: %s\r\n", vtProp.bstrVal);
VariantClear(&vtProp);
CSettingsStore store(true, true);
if (store.Open(L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"))
{
CString strDisplayVersion;
const auto buildNumber = _ttoi(CString(vtProp.bstrVal));
if (buildNumber > 19041)
{
if (store.Read(L"DisplayVersion", strDisplayVersion))
{
strSystemInfo.AppendFormat(L" Version Codename: %s\r\n", strDisplayVersion);
}
}
else
{
if (store.Read(L"ReleaseId", strDisplayVersion))
{
strSystemInfo.AppendFormat(L" Version Codename: %s\r\n", strDisplayVersion);
}
}
}
它在我的“关于”窗口上显示以下输出:
Edition: Microsoft Windows 11 Home
Version: 10.0.22631
Version Build Number: 22631
Version Codename: 23H2