Código:
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);
Isso funciona., reuni as descrições de lançamento aqui . Mas existe uma maneira integrada de obter essa descrição, por exemplo: 23H2?
Não sei a resposta de cara, mas sei por onde começar a procurar:
winver.exe
.Aqui está minha caixa de diálogo Sobre o Windows , que exibe obedientemente a string "Versão 22H2" que você procura:
winver.exe
no WinDbg ou Ghidra ou o que quer que seja mostra quewinver.exe
apenas chamaShell32.dll!ShellAboutW
para fazer todo o seu trabalho real.AboutDlgProc
para conduzir a caixa de diálogo Sobre o Windows ._InitAboutDlg
para carregar os dados (strings, texto, etc) nos rótulos/espaços reservados do diálogo.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
chave de registro e extrai valores com base em algumas regras de negócios arbitrárias :EnableH2UIVersioning
que controla se o nome da versão no estilo "22H2" será exibido ou não. Quando isso acontecetrue
, a string "22H2" vem deHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DisplayVersion
, caso contrário, ela usaHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseId
.DisplayVersion
eReleaseId
estão presentes, masReleaseId
contém o valor incorreto/antigo de "2009" - o que significa queReleaseId
não é confiável se estiver presente.Com base nas sugestões dos comentários, encontrei a seguinte solução:
Que exibe a seguinte saída na minha janela Sobre: