【发布时间】: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