社本@元ネオニート Blog

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

AILight Banner
AILight Blog

プロフィール

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

目次

Blog 利用状況

記事分類

過去の記事

タグ

(ファイル)バージョン文字列を扱うクラス (CVersionStringT) - Windows

"1.0.0.1"や"1.00.000.2"といった(ファイル)バージョン文字列を
扱うクラスです。


---
#pragma once

#include <vector>


////////////////////////////////////////////////////////////////////////////////
// CVersionStringT

template <int t_nCount>
class CVersionStringT
{
protected:
 typedef CVersionStringT<t_nCount>   thisClass;

public:
 CVersionStringT() : m_dwVals(t_nCount)
 {
  this->SetVersion(_T(""));
 }
 CVersionStringT(LPCTSTR szVersion) : m_dwVals(t_nCount)
 {
  this->SetVersion(szVersion);
 }
 ~CVersionStringT()
 {
 }

public:
 CString GetVersion()
 {
  return thisClass::Convert(&m_dwVals[0]);
 }
 void SetVersion(LPCSTR szVersion)
 {
  thisClass::Parse(szVersion, &m_dwVals[0]);
 }

public:
 int Compare(thisClass VersionString)
 {
  return thisClass::Compare(*this, VersionString);
 }

public:
 static CString Convert(DWORD* dwVersion)
 {
  CString strVersion;

  for (int i = 0; i < t_nCount; i++)
  {
   TCHAR szValue[16] = { 0 };
   _itot(dwVersion[i], szValue, 10);

   if (i == 0)
   {
    strVersion = szValue;
   }
   else
   {
    strVersion += CString(_T(".")) + szValue;
   }
  }

  return strVersion;
 }
 void Parse(LPCTSTR szVersion, DWORD* dwVersion)
 {
  CString strVersion = szVersion;

  for (int i = 0; i < t_nCount; i++)
  {
   int nLength = strVersion.Find(_T("."), 0);
   if (nLength == -1)
   {
    CString str = strVersion.Left(strVersion.GetLength());
    nLength = strVersion.GetLength();

    dwVersion[i] = _tstoi(str);
   }
   else
   {
    CString str = strVersion.Left(nLength);
    dwVersion[i] = _tstoi(str);
   }

   strVersion = strVersion.Right(strVersion.GetLength() - nLength - 1);
  }
 }
 static int Compare(LPCTSTR szVersion1, LPCTSTR szVersion2)
 {
  thisClass VersionString1(szVersion1);
  thisClass VersionString2(szVersion2);

  return thisClass::Compare(VersionString1, VersionString2);
 }
 static int Compare(const thisClass& VersionString1, const thisClass& VersionString2)
 {
  for (int i = 0; i < t_nCount; i++)
  {
   if      (VersionString1.m_dwVals[i] < 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;
---

投稿日時 : 2007年4月13日 13:24


コメントを追加

#  re: (ファイル)バージョン文字列を扱うクラス (CVersionStringT) - Windows 2007年4月13日 19:29 渋木宏明(ひどり)

比較とかの演算子は定義しないの?

#  re: (ファイル)バージョン文字列を扱うクラス (CVersionStringT) - Windows 2007年4月14日 6:49 菊池

Compareがあるだけじゃ納得いかん人もう一人追加
タイトル
名前
URL
コメント