如何改进这段比较版本信息的代码?
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;
}
我比较版本信息的逻辑有问题。
采取这个方法:
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;
}