TNB Library
TnbFileVersion.h
[詳解]
1#pragma once
11#include "TnbStr.h"
12
13
14
15#ifndef _WIN32_WCE
16 #include <Winver.h>
17 #pragma comment(lib,"version.lib")
18#endif
19
20
21
22//TNB Library
23namespace TNB
24{
25
26
27
44{
45public:
46
48 CFileVersion(void) : m_pFileInfo(NULL), m_pLangCodePage(NULL), m_langCodePageSize(0)
49 {
50 }
51
57 bool IsValid(void) const
58 {
59 return m_pFileInfo != NULL;
60 }
61
69 bool Open(LPCTSTR lpszFile = NULL, HINSTANCE hInst = NULL)
70 {
71 CStr strFile;
72 if ( lpszFile != NULL )
73 {
74 strFile = lpszFile;
75 }
76 else
77 {
78 ::GetModuleFileName(hInst, strFile.GetBuffer(MAX_PATH), MAX_PATH);
79 strFile.ReleaseBuffer();
80 }
81 DWORD dummy;
82 DWORD size = ::GetFileVersionInfoSize(strFile.GetBuffer(), &dummy);
83 if ( size != 0)
84 {
85 m_workMem.Resize(size);
86 ZeroMemory(m_workMem, size);
87 if ( ::GetFileVersionInfo(strFile.GetBuffer(), 0, size, m_workMem) )
88 {
89 UINT uLen;
90 if ( ::VerQueryValue(m_workMem, _T("\\"), reinterpret_cast<LPVOID*>(&m_pFileInfo), &uLen) )
91 {
92 if ( m_pFileInfo->dwSignature == VS_FFI_SIGNATURE )
93 {
94 if ( ::VerQueryValue(m_workMem,
95 _T("\\VarFileInfo\\Translation"),
96 reinterpret_cast<LPVOID*>(&m_pLangCodePage),
97 &m_langCodePageSize) )
98 {
99 m_langCodePageSize /= sizeof(DWORD);
100 strFile.ReleaseBuffer();
101 m_fileName = strFile;
102 return true;
103 }
104 }
105 }
106 }
107 }
108 Close();
109 return false;
110 }
111
115 void Close(void)
116 {
117 m_workMem.Free();
118 m_pFileInfo = NULL;
119 m_pLangCodePage = NULL;
120 m_langCodePageSize = 0;
121 m_fileName.Empty();
122 }
123
129 const VS_FIXEDFILEINFO* GetFileInfo(void) const
130 {
131 return m_pFileInfo;
132 }
133
141 {
142 return m_pFileInfo;
143 }
144
164 CStr Get(LPCTSTR lpszType, WORD wLanguage = 0) const
165 {
166 LPVOID P = m_GetTextPtr(lpszType, wLanguage);
167 if ( P != NULL )
168 {
169 if ( HasUnicodeType() )
170 {
171 return CStr(reinterpret_cast<LPCWSTR>(P));
172 }
173 else
174 {
175 return CStr(reinterpret_cast<LPCSTR>(P));
176 }
177 }
178 return CStr();
179 }
180
187 CStr GetAboutText(LPCTSTR lpszVerText, WORD wLanguage = 0) const
188 {
189 if ( ! IsValid() ){ return CStr(); }
190 return CStr::Fmt(_T("%s %s %s\n\n%s")
191 , Get(_T("FileDescription"))
192 , lpszVerText
195 );
196 }
197
204 CStr GetCopyrightText(WORD wLanguage = 0) const
205 {
206 if ( ! IsValid() ){ return CStr(); }
207 return CStr::Fmt(_T("%s %s"),
208 Get(_T("LegalCopyright"), wLanguage),
209 Get(_T("CompanyName"), wLanguage));
210 }
211
218 CStr GetFileVersionText(WORD wLanguage = 0) const
219 {
220 return m_GetVersionText(_T("FileVersion"), wLanguage);
221 }
222
229 CStr GetProductVersionText(WORD wLanguage = 0) const
230 {
231 return m_GetVersionText(_T("ProductVersion"), wLanguage);
232 }
233
239 bool IsSpecialBuild(void) const
240 {
241 if ( IsValid() )
242 {
243 DWORD f = m_pFileInfo->dwFileFlags & m_pFileInfo->dwFileFlagsMask;
244 return (f & VS_FF_SPECIALBUILD) != 0;
245 }
246 return false;
247 }
248
254 bool IsPrivateBuild(void) const
255 {
256 if ( IsValid() )
257 {
258 DWORD f = m_pFileInfo->dwFileFlags & m_pFileInfo->dwFileFlagsMask;
259 return (f & VS_FF_PRIVATEBUILD) != 0;
260 }
261 return false;
262 }
263
264#ifndef _WIN32_WCE
265
276 INT_PTR Modify(LPCTSTR lpszType, LPCTSTR lpszValue, WORD wLanguage = 0)
277 {
278 INT_PTR res = -1;
279 if ( IsValid() )
280 {
281 LPVOID P = m_GetTextPtr(lpszType, wLanguage);
282 if ( P != NULL )
283 {
284 if ( HasUnicodeType() )
285 {
286 LPWSTR lpsz = reinterpret_cast<LPWSTR>(P);
287 res = STRLIB::GetLen(lpsz);
288 CUnicode val = lpszValue;
289 STRLIB::Copy(lpsz, val.Left(res));
290 }
291 else
292 {
293 LPSTR lpsz = reinterpret_cast<LPSTR>(P);
294 res = STRLIB::GetLen(lpsz);
295 CAscii val = lpszValue;
296 STRLIB::Copy(lpsz, val.Left(res));
297 }
298 }
299 }
300 return res;
301 }
302
314 INT_PTR ModifyFileVersion(WORD v1, WORD v2, WORD v3, WORD v4, WORD wLanguage = 0)
315 {
316 if ( IsValid() )
317 {
318 CStr s;
319 s.Format(_T("%d,%d,%d,%d"), v1, v2, v3, v4);
320 m_pFileInfo->dwFileVersionMS = MAKELONG(v2, v1);
321 m_pFileInfo->dwFileVersionLS = MAKELONG(v4, v3);
322 return Modify(_T("FileVersion"), s, wLanguage);
323 }
324 return -1;
325 }
326
338 INT_PTR ModifyProductVersion(WORD v1, WORD v2, WORD v3, WORD v4, WORD wLanguage = 0)
339 {
340 if ( IsValid() )
341 {
342 CStr s;
343 s.Format(_T("%d,%d,%d,%d"), v1, v2, v3, v4);
344 m_pFileInfo->dwProductVersionMS = MAKELONG(v2, v1);
345 m_pFileInfo->dwProductVersionLS = MAKELONG(v4, v3);
346 return Modify(_T("ProductVersion"), s, wLanguage);
347 }
348 return -1;
349 }
350
357 bool WritePush(void)
358 {
359 if ( IsValid() )
360 {
361 HANDLE h = ::BeginUpdateResource(m_fileName, FALSE);
362 if ( h != NULL )
363 {
364 bool r = !! ::UpdateResource(h,
365 RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
366 m_workMem.Ref(), ToDword(m_workMem.GetSize()));
367 r &= !! ::EndUpdateResource(h, FALSE);
368 return r;
369 }
370 }
371 return false;
372 }
373
374#endif // _WIN32_WCE
375
376protected:
377
384 virtual void OnGetVerisonText(CStr& _str, DWORD flag, WORD wLanguage) const
385 {
386 if ( (flag & VS_FF_SPECIALBUILD) != 0 )
387 {
388 _str += _T(" ");
389 _str += Get(_T("SpecialBuild"), wLanguage);
390 }
391 if ( (flag & VS_FF_PRIVATEBUILD) != 0 )
392 {
393 _str += _T(" ");
394 _str += Get(_T("PrivateBuild"), wLanguage);
395 }
396 if ( (flag & VS_FF_PRERELEASE) != 0 )
397 {
398 _str += _T(" [PreRelease版]");
399 }
400 if ( (flag & VS_FF_DEBUG) != 0 )
401 {
402 _str += _T(" ≪Debug版≫");
403 }
404 }
405
406private:
408 struct TLangAndCodePage
409 {
410 WORD wLanguage;
411 WORD wCodePage;
412 };
413 mutable CWorkMem m_workMem;
414 VS_FIXEDFILEINFO* m_pFileInfo;
415 TLangAndCodePage* m_pLangCodePage;
416 UINT m_langCodePageSize;
417 CStr m_fileName;
419 LPVOID m_GetTextPtr(LPCTSTR lpszType, WORD wLanguage = 0) const
420 {
421 if ( IsValid() )
422 {
423 // 各言語とコードページのファイルの説明を読み取る。
424 for ( UINT i = 0; i < m_langCodePageSize; i++ )
425 {
426 if ( wLanguage == 0 || m_pLangCodePage[i].wLanguage == wLanguage )
427 {
428 CStr strKey;
429 strKey.Format(
430 _T("\\StringFileInfo\\%04x%04x\\%s"),
431 m_pLangCodePage[i].wLanguage, //Lang
432 m_pLangCodePage[i].wCodePage, //Code
433 lpszType);
434 // i 番目の言語とコードページのファイルの説明を取得する。
435 UINT dmy;
436 if ( HasUnicodeType() )
437 {
438 CUnicode s = strKey;
439 LPWSTR P;
440 if ( ::VerQueryValueW(m_workMem,
441 s.GetBuffer(),
442 reinterpret_cast<LPVOID*>(&P),
443 &dmy) )
444 {
445 return P;
446 }
447 }
448 else
449 {
450 #ifndef _WIN32_WCE
451 CAscii s = strKey;
452 LPSTR P;
453 if ( ::VerQueryValueA(m_workMem,
454 s.GetBuffer(),
455 reinterpret_cast<LPVOID*>(&P),
456 &dmy) )
457 {
458 return P;
459 }
460 #endif
461 }
462 }
463 }
464 }
465 return NULL;
466 }
467
473 bool HasUnicodeType(void) const
474 {
475 bool r = false;
476 if ( m_pFileInfo != NULL )
477 {
478 switch ( m_pFileInfo->dwFileOS )
479 {
480 case VOS_DOS_WINDOWS16:
481 case VOS_OS216_PM16:
482 break;
483 default:
484 r = true;
485 break;
486 }
487 }
488 return r;
489 }
490
492 CStr m_GetVersionText(LPCTSTR lpszVer, WORD wLanguage = 0) const
493 {
494 CStr s;
495 if ( IsValid() )
496 {
497 s = Get(lpszVer, wLanguage);
498 DWORD f = m_pFileInfo->dwFileFlags & m_pFileInfo->dwFileFlagsMask;
499 OnGetVerisonText(s, f, wLanguage);
500 }
501 return s;
502 }
503};
504
505
506
507}; // TNB
508
509
510
511#ifdef _TnbDOXYGEN //Document作成用シンボル
512
518{
519};
520
521#endif // _TnbDOXYGEN
522
523
文字列管理関係のヘッダ
ファイルバージョン取得クラス.
bool Open(LPCTSTR lpszFile=NULL, HINSTANCE hInst=NULL)
[設定] オープン
CStr GetCopyrightText(WORD wLanguage=0) const
[取得] 著作権文字列取得.
CStr GetAboutText(LPCTSTR lpszVerText, WORD wLanguage=0) const
[取得] About画面用文字列取得.
INT_PTR Modify(LPCTSTR lpszType, LPCTSTR lpszValue, WORD wLanguage=0)
[変更] 情報変更.
CFileVersion(void)
コンストラクタ
CStr Get(LPCTSTR lpszType, WORD wLanguage=0) const
[取得] 情報取得(文字列)
bool IsValid(void) const
[確認] 有効か
bool WritePush(void)
[設定] 書き込み.
INT_PTR ModifyProductVersion(WORD v1, WORD v2, WORD v3, WORD v4, WORD wLanguage=0)
[変更] プロダクトバージョン変更.
void Close(void)
[設定] クローズ
CStr GetFileVersionText(WORD wLanguage=0) const
[取得] ファイルバージョン文字列取得.
bool IsSpecialBuild(void) const
[取得] スペシャルビルドチェック.
VS_FIXEDFILEINFO * GetFileInfo(void)
[取得] 情報取得.
virtual void OnGetVerisonText(CStr &_str, DWORD flag, WORD wLanguage) const
[通知] GetVersionText コール通知.
INT_PTR ModifyFileVersion(WORD v1, WORD v2, WORD v3, WORD v4, WORD wLanguage=0)
[変更] ファイルバージョン変更.
const VS_FIXEDFILEINFO * GetFileInfo(void) const
[取得] 情報取得
bool IsPrivateBuild(void) const
[取得] プライベートビルドチェック.
CStr GetProductVersionText(WORD wLanguage=0) const
[取得] プロダクトバージョン文字列取得.
CStrT Left(size_t iSize) const
[作成] 範囲取得.
Definition: TnbStr.h:801
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
Definition: TnbStr.h:359
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbDef.h:665
void Resize(size_t l)
[設定] サイズ再設定
Definition: TnbDef.h:672
void Free(void)
[設定] 解放.
Definition: TnbDef.h:652
const TYP * Ref(void) const
[取得] ポインタ取得
Definition: TnbDef.h:712
size_t GetLen(LPCSTR lpsz)
[計算] 文字列長計算(ASCII/SJIS用)
Definition: TnbStrLib.h:44
DWORD ToDword(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:395
TNB::CStrT< TCHAR > CStr
文字列クラス
Definition: TnbStr.h:1785
void Copy(LPSTR _dst, LPCSTR src)
[複製] 文字列コピー(ASCII/SJIS用)
Definition: TnbStrLib.h:89
TNB Library
Definition: TnbDoxyTitle.txt:2
ファイルバージョン情報構造体.