社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

(ファイル)バージョン文字列を扱うクラス (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


コメントを追加

タイトル
名前
URL
コメント