代码:
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”对话框,它忠实地显示了您要查找的“Version 22H2”字符串:
winver.exe
在 WinDbg 或 Ghidra 或其他什么中启动表明它winver.exe
只是调用来Shell32.dll!ShellAboutW
完成所有实际工作。AboutDlgProc
来驱动“关于 Windows”对话框。_InitAboutDlg
将数据(字符串、文本等)加载到对话框的标签/占位符中。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
注册表项,然后根据一些任意业务规则提取值:EnableH2UIVersioning
它控制是否显示“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
如果存在则不能信任。根据评论中的建议,我提出了以下解决方案:
它在我的“关于”窗口上显示以下输出: