在代码中,我有2个CString
,其中包含版本号的一部分,
第一个exe包含版本1.1234.3.1,第二个exe包含版本1.2.3.1。
代码应该是
假设
CString MinVreg,MinFref;
if(MinVreg<MinFref) //when MinVreg="1234" and MinFref="2"
{
//it enters in if loop.
//Update registry
}
elseif(MinVreg>MinFref)
{
//Show message box..
}
我认为操作员只检查第一个数字。所以请告诉我如何将其作为数字进行比较
答案 0 :(得分:2)
您必须解析字符串以将版本表示为整数数组,然后执行字典比较。
bool ParseVersionString(unsigned digits[4], const CString& i_version)
{
return sscanf(i_version, "%d.%d.%d.%d", &digits[0], &digits[1],
&digits[2], &digits[3]) == 4;
}
int CompareVersions(unsigned ver1[4], unsigned ver2[4])
{
for (int i = 0; i != 4; ++i)
{
if (ver1[i] < ver2[i])
return -1;
if (ver1[i] > ver2[i])
return 1;
}
return 0;
}
用法:
CString MinVreg("1.1234.3.1"), MinFref("1.2.3.1");
unsigned ver1[4], ver2[4];
if (ParseVersionString(ver1, MinVreg) &&
ParseVersionString(ver2, MinFref) &&
CompareVersions(ver1, ver2) < 0)
{
//Update registry
}
答案 1 :(得分:1)
试试这个:
if ( atoi((char*)(LPCTSTR)MinVreg) < atoi((char*)(LPCTSTR)MinFref)
{
//Do the Stuff
}
答案 2 :(得分:1)
您应该使用strstr函数来检查character
是否存在。
if( NULL != strstr(MinVreg, MinFref) )
{
//enter the loop
}
修改强> ::
如果您想将它们与int
进行比较,则需要将它们转换为int
。
if( atoi(MinVreg) < atoi(MinFref) )
{
//MinVreg < MinFref, Do something
}
elseif( atoi(MinVreg) > atoi(MinFref) )
{
//MinVreg > MinFref, Do something
}
else
{
//MinVreg = MinFref, Do something
}
更新 ::将问题数据编辑为MinVreg = 1.1234.3.1 and MinFref = 1.2.3.1
int a ;
a = strcmp( MinVreg, MinFref ) ;
if( a < 0 )
{
//MinVreg < MinFref, Do something
}
elseif( a > 0 )
{
//MinVreg > MinFref, Do something
}
else
{
//MinVreg = MinFref, Do something
}
答案 3 :(得分:0)
为什么首先使用字符串?以下是我如何跟踪版本。
BOOL GetProductVersion(VS_FIXEDFILEINFO &fixedFileInfo, LPCTSTR szFileName)
{
DWORD dwHandle = 0;
DWORD dwLen = GetFileVersionInfoSize(szFileName, &dwHandle);
if (dwLen == 0)
return FALSE;
LPSTR lpVI = new CHAR[dwLen];
if (!lpVI)
return FALSE;
ZeroMemory(lpVI, dwLen);
GetFileVersionInfo(szFileName, dwHandle, dwLen, lpVI);
DWORD dwBufSize;
VS_FIXEDFILEINFO* lpFFI;
if (VerQueryValue(lpVI, "\\", (LPVOID*)&lpFFI, (PUINT)&dwBufSize))
{
fixedFileInfo = *lpFFI;
delete [] lpVI;
return TRUE;
}
delete [] lpVI;
return FALSE;
}
CString GetProductVersionAsString(LPCTSTR szFileName)
{
CString version;
VS_FIXEDFILEINFO ffi;
if (GetProductVersion(ffi, szFileName))
{
stringstream ss;
ss << HIWORD(ffi.dwProductVersionMS) << '.';
ss << LOWORD(ffi.dwProductVersionMS) << '.';
ss << HIWORD(ffi.dwProductVersionLS);
UINT beta = LOWORD(ffi.dwProductVersionLS);
if (beta)
ss << " beta" << beta;
version = ss.str().c_str();
}
return version;
}
DWORD GetProductVersionAsInteger(LPCTSTR szFileName)
{
DWORD version = 0;
VS_FIXEDFILEINFO ffi;
if (GetProductVersion(ffi, szFileName))
{
// Apply your number logic here!
// This code is suitable for x.y.z
version += 100 * HIWORD(ffi.dwProductVersionMS);
version += 10 * LOWORD(ffi.dwProductVersionMS);
version += HIWORD(ffi.dwProductVersionLS);
}
return version;
}
因此,“1.0.2”变为102.显然,较大的版本号需要其他乘数。