2

バージョン番号の一部を含む2つのコードではCString、最初のexeにはバージョン1.1234.3.1が含まれ、2番目の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..
}

オペレーターは1桁目だけチェックしていると思うので、数値として比較する方法を教えてください

4

4 に答える 4

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
  }
于 2012-10-17T08:19:33.733 に答える
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
}
于 2012-10-17T07:01:32.413 に答える
1

これを試して:

    if ( atoi((char*)(LPCTSTR)MinVreg) <  atoi((char*)(LPCTSTR)MinFref)
    {
    //Do the Stuff
    }
于 2012-10-17T06:39:20.390 に答える
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 になります。明らかに、より大きなバージョン番号には他の乗数が必要です。

于 2012-10-17T11:46:05.067 に答える