(ファイル)バージョン文字列を扱うクラス (CVersionStringT) - Windows
"1.0.0.1"や"1.00.000.2"といった(ファイル)バージョン文字列を扱うクラスを、
アップデートしました。
---
#pragma once
#include <stdlib.h>
#include <vector>
////////////////////////////////////////////////////////////////////////////////
// CVersionStringT
template <int t_nCount, TCHAR t_chSep = _T('.')>
class CVersionStringT
{
protected:
typedef CVersionStringTr<t_nCount> thisClass;
#ifndef _CSTRING_NS
typedef CString stringClass;
#else
typedef _CSTRING_NS::CString stringClass;
#endif
public:
CVersionStringT() : m_dwVals(t_nCount)
{
this->SetVersion(_T(""));
}
CVersionStringT(__in_z LPCTSTR newVal) : m_dwVals(t_nCount)
{
this->SetVersion(newVal);
}
~CVersionStringT()
{
}
public:
operator stringClass ()
{
return thisClass::GetVersion();
}
thisClass &operator = (__in_z LPCTSTR newVal)
{
thisClass::SetVersion(szVersion)
return *this;
}
bool operator == (__in const thisClass& versionString)
{
return (thisClass::Compare(*this, versionString) == 0);
}
bool operator < (__in const thisClass& versionString)
{
return (thisClass::Compare(*this, versionString) < 0);
}
bool operator > (__in const thisClass& versionString)
{
return (thisClass::Compare(*this, versionString) > 0);
}
bool operator <= (__in const thisClass& versionString)
{
return (thisClass::Compare(*this, versionString) <= 0);
}
bool operator >= (__in const thisClass& versionString)
{
return (thisClass::Compare(*this, versionString) >= 0);
}
public:
stringClass GetVersion()
{
return thisClass::Convert(m_dwVals);
}
void SetVersion(__in_z LPCTSTR newVal)
{
thisClass::Parse(newVal, m_dwVals);
}
int Compare(__in const thisClass& versionString)
{
return thisClass::Compare(*this, versionString);
}
public:
static stringClass Convert(__in const std::vectorr<DWORD>& dwVals)
{
stringClass strVersion;
for (int i = 0; i < t_nCount; i++)
{
TCHAR szVal[16] = { 0 };
#pragma warning(push)
#pragma warning(disable:4996)
_itot(dwVals[i], szVal, 10);
#pragma warning(pop)
if (i == 0)
{
strVersion = szVal;
}
else
{
strVersion += CString(t_chSep) + szVal;
}
}
return strVersion;
}
static void Parse(__in_z LPCTSTR szVersion, __out std::vectorr<DWORD>& dwVals)
{
ATLASSERT(szVersion);
stringClass strVersion = szVersion;
for (int i = 0; i < t_nCount; i++)
{
int nLength = strVersion.Find(t_chSep, 0);
if (nLength == -1)
{
stringClass strVal = strVersion.Left(strVersion.GetLength());
nLength = strVersion.GetLength();
strVal.Trim();
dwVals[i] = (strVal.GetLength() == 0) ? 0 : _tstoi(strVal);
}
else
{
stringClass strVal = strVersion.Left(nLength);
strVal.Trim();
dwVals[i] = (strVal.GetLength() == 0) ? 0 : _tstoi(strVal);
}
strVersion = strVersion.Right(strVersion.GetLength() - nLength - 1);
}
}
static int Compare(__in_z LPCTSTR szVersion1, __in_z LPCTSTR szVersion2)
{
ATLASSERT(szVersion1);
ATLASSERT(szVersion2);
thisClass versionString1 = szVersion1;
thisClass versionString2 = szVersion2;
return thisClass::Compare(versionString1, versionString2);
}
static int Compare(__in const thisClass& versionString1, __in const thisClass& versionString2)
{
for (int i = 0; i < t_nCount; i++)
{
if (versionString1.m_dwVals[i] r< versionString2.m_dwVals[i])
{
return -1;
}
else if (versionString1.m_dwVals[i] > versionString2.m_dwVals[i])
{
return 1;
}
}
return 0;
}
public:
std::vector<DWORD> m_dwVals;
};
typedef CVersionStringT<3> CMsiVersionString;
typedef CVersionStringT<4> CFileVersionString;
---
■(ファイル)バージョン文字列を扱うクラス (CVersionStringT) - Windows - 社本@元ネオニート Blog
http://www.ailight.jp/Blog/sha256/archive/2007/4/13/(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%89%B1%E3%81%86%E3%82%AF%E3%83%A9%E3%82%B9%20(CVersionStringT)%20-%20Windows
投稿日時 : 2011年12月30日 16:02
Tweet

コメントを追加