Visual c++ 比较两个包含版本号的CString

Visual c++ 比较两个包含版本号的CString,visual-c++,mfc,compare,cstring,Visual C++,Mfc,Compare,Cstring,在一个代码中,我有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

在一个代码中,我有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..
}
CString MinVreg,MinFref;
if(MinVregMinFref)
{
//显示消息框。。
}
我认为操作员只检查第一个数字。因此请告诉我如何将其作为数字进行比较

    if ( atoi((char*)(LPCTSTR)MinVreg) <  atoi((char*)(LPCTSTR)MinFref)
    {
    //Do the Stuff
    }
if(atoi((char*)(LPCTSTR)MinVreg)
试试这个:

    if ( atoi((char*)(LPCTSTR)MinVreg) <  atoi((char*)(LPCTSTR)MinFref)
    {
    //Do the Stuff
    }
if(atoi((char*)(LPCTSTR)MinVreg)
您应该使用函数检查
字符是否存在

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
}
您应该使用函数检查
字符是否存在

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
}

您必须解析字符串以将版本表示为整数数组,然后执行字典比较

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;
  }
bool ParseVersionString(无符号数字[4],常量CString&i_版本)
{
返回sscanf(i_版本,“%d.%d.%d.%d”、&位数[0]、&位数[1],
&数字[2]、&数字[3])==4;
}
整数比较(无符号的ver1[4],无符号的ver2[4])
{
对于(int i=0;i!=4;++i)
{
if(ver1[i]ver2[i])
返回1;
}
返回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
  }
CString MinVreg(“1.1234.3.1”)、MinFref(“1.2.3.1”);
未签名的ver1[4],ver2[4];
if(ParseVersionString(ver1,MinVreg)&&
ParseVersionString(版本2,MinFref)&&
比较(第1、2版)<0
{
//更新注册表
}

您必须解析字符串,将版本表示为整数数组,然后执行字典比较

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;
  }
bool ParseVersionString(无符号数字[4],常量CString&i_版本)
{
返回sscanf(i_版本,“%d.%d.%d.%d”、&位数[0]、&位数[1],
&数字[2]、&数字[3])==4;
}
整数比较(无符号的ver1[4],无符号的ver2[4])
{
对于(int i=0;i!=4;++i)
{
if(ver1[i]ver2[i])
返回1;
}
返回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
  }
CString MinVreg(“1.1234.3.1”)、MinFref(“1.2.3.1”);
未签名的ver1[4],ver2[4];
if(ParseVersionString(ver1,MinVreg)&&
ParseVersionString(版本2,MinFref)&&
比较(第1、2版)<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;
}
BOOL GetProductVersion(VS_FIXEDFILEINFO&FIXEDFILEINFO,LPCTSTR szFileName)
{
DWORD dwHandle=0;
DWORD dwLen=GetFileVersionInfo大小(szFileName,&dwHandle);
如果(dwLen==0)
返回FALSE;
LPSTR lpVI=新字符[dwLen];
如果(!lpVI)
返回FALSE;
零存储器(lpVI、dwLen);
GetFileVersionInfo(szFileName、dwHandle、dwLen、lpVI);
德沃德·德布夫西兹;
VS_FIXEDFILEINFO*lpFFI;
if(VerQueryValue(lpVI,“\\”,(LPVOID*)和lpFFI,(PUINT)和dwBufSize))
{
fixedFileInfo=*lpFFI;
删除[]lpVI;
返回TRUE;
}
删除[]lpVI;
返回FALSE;
}
CString GetProductVersionAsString(LPCTSTR szFileName)
{
CString版本;
VS_FIXEDFILEINFO外国金融机构;
if(GetProductVersion(ffi,szFileName))
{
细流ss;

为什么首先要使用字符串?下面是我如何跟踪版本的

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;
}
BOOL GetProductVersion(VS_FIXEDFILEINFO&FIXEDFILEINFO,LPCTSTR szFileName)
{
DWORD dwHandle=0;
DWORD dwLen=GetFileVersionInfo大小(szFileName,&dwHandle);
如果(dwLen==0)
返回FALSE;
LPSTR lpVI=新字符[dwLen];
如果(!lpVI)
返回FALSE;
零存储器(lpVI、dwLen);
GetFileVersionInfo(szFileName、dwHandle、dwLen、lpVI);
德沃德·德布夫西兹;
VS_FIXEDFILEINFO*lpFFI;
if(VerQueryValue(lpVI,“\\”,(LPVOID*)和lpFFI,(PUINT)和dwBufSize))
{
fixedFileInfo=*lpFFI;
删除[]lpVI;
返回TRUE;
}
删除[]lpVI;
返回FALSE;
}
CString GetProductVersionAsString(LPCTSTR szFileName)
{
CString版本;
VS_FIXEDFILEINFO外国金融机构;
if(GetProductVersion(ffi,szFileName))
{
细流ss;

学生:你应该等待“完美答案”。@Sivaraman提供的解决方案是一段糟糕的代码,包含了不必要和无意义的铸件,尽管它提供了你问题的答案(告诉我如何将其作为一个数字进行比较)。你应该等待“完美答案”@Sivaraman提供的解决方案是一段糟糕的代码,包含了不必要和无意义的铸件,尽管它提供了您问题的答案(告诉我如何将其作为一个数字进行比较)@vikky-我不明白,上面的解决方案是如何被接受的。这是一个比另一个好得多的解决方案。@Abhineet如果MinVreg=234和MinFref=2,那么它就进入了循环。是的,现在它对我来说是有意义的:-)@vikky-我不明白,上面的解决方案是如何被接受的。这是一个比另一个好得多的解决方案。@Abhineet如果MinVreg=234和MinFref=2,那么它就进入了循环。是的,现在我明白了:-)我们必须从注册表中获取exe版本和从文件夹中获取exe版本,然后进行比较。然后对其进行解析并使用相同的逻辑。我将使用点标记字符串,然后或将每个部分标记为整数-每个部分8位。不过,我相信Andrey的回答足够了!我们必须获取exe fr版本从注册表和文件夹中的exe版本,然后我们必须对其进行比较。然后对其进行解析并使用相同的逻辑。我将使用点标记字符串,然后或将每个部分标记为一个整数-每个部分8位。但是,我