如何改进这段比较版本信息的代码?

How can this code to compare version information be improved?

我比较版本信息的逻辑有问题。

采取这个方法:

bool CPTSDatabase::IsInstalledPublicTalksVersionSupported()
{
    CSettingsStore store(TRUE, TRUE);
    CString strPath, strVersion;
    VS_FIXEDFILEINFO* pVerInfo = nullptr;
    bool bOK = false;

    if (store.Open(_T("Software\Community Talks\Public Talks")))
    {
        if (store.Read(_T("AppPath"), strPath))
        {
            //yes, but is the path still valid
            if (PathFileExists(strPath))
            {
                pVerInfo = theApp.ExtractVersionInformation(strPath, strVersion);
                if (pVerInfo != nullptr)
                {
                    if (HIWORD(pVerInfo->dwFileVersionMS) >= 20 &&
                        LOWORD(pVerInfo->dwFileVersionMS) >= 0 &&
                        HIWORD(pVerInfo->dwFileVersionLS) >= 3)
                    {
                        bOK = true;
                    }
                }
            }
        }
    }

    return bOK;
}

问题是这个位:

if (HIWORD(pVerInfo->dwFileVersionMS) >= 20 &&
    LOWORD(pVerInfo->dwFileVersionMS) >= 0 &&
    HIWORD(pVerInfo->dwFileVersionLS) >= 3)
{
    bOK = true;
}

有问题的可执行文件现在是 21.0.1,当然 pVerInfo->dwFileVersionLS 测试失败了。是否有更强大的 wat 来检查所讨论的版本是否大于 20.0.3 而没有很多 if 子句?

只需使用 64 位 int。

auto Version = [](WORD a, WORD b, WORD c)
{
  return int64_t(a)<<32 | int64_t(b)<<16 | int64_t(c);
};

if (Version(HIWORD(pVerInfo->dwFileVersionMS),LOWORD(pVerInfo->dwFileVersionMS),HIWORD(pVerInfo->dwFileVersionLS))>=Version(20,0,3))
{
  bOK = true;
}