【问题标题】:How can this code to compare version information be improved?如何改进这个比较版本信息的代码?
【发布时间】:2021-08-04 11:05:31
【问题描述】:

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

采取这种方法:

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 测试失败了。在没有很多 if 子句的情况下,是否有更强大的方法来检查相关版本是否大于 20.0.3

【问题讨论】:

  • 将版本信息转换为 64 位(或 128 位)值,将版本编码为相应的 16 位(或 32 位)宽范围。有了它,您可以与单个值进行比较,例如0x0014'0000'0003'0000.

标签: visual-c++ mfc versioninfo


【解决方案1】:

只需使用 64 位整数。

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;
}

【讨论】:

  • 谢谢。现在尝试。我必须在第一个值周围添加HIWORD(...),并在函数调用中为第二个添加关闭)。现在测试。
  • 具有讽刺意味的代码检查告诉我变量Version在构造后不会改变,它应该被标记为const。似乎 VC 甚至没有意识到它是一个函数。
  • 重命名... ;)
  • 自动版本 -> 自动版本FromWORDToInt64
  • Visual Studio 是正确的。 Version 是一个存储 lambda 表达式的变量。您可以使用函数调用语法调用 lambda 表达式这一事实并不能使其成为函数。使变量const 的建议是合理的,即auto const Version = ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多