// バージョンリソースアクセスクラス // (C)2002,2003 Yutaka Wada, AirparkLab /* 使い方 CVersion Version; CString str = Version.GetInternalName(); などとしてバージョンリソースを文字列で取得できる。 バージョンリソースはリソースエディタで記述する。 パブリックメンバ関数は以下の通り。 CVersion() 自分自身のバージョンリソースにアクセスする場合のコンストラクタ CVersion( CString Filename ) 指定した実行ファイルのバージョンリソースにアクセスする場合のコンストラクタ CString GetFileVersion() ファイルバージョンの取得 CString GetProductVersion() プロダクトバージョンの取得 CString GetComments() コメントの取得 CString GetCompanyName() 会社名の取得 CString GetFileDescription() ファイルの説明の取得 CString GetInternalName() 内部名の取得 CString GetLegalCopyright() 著作権表示の取得 CString GetLegalTrademarks() トレードマークの取得 CString GetOriginalFilename() オリジナルファイル名の取得 CString GetPrivateBuild() プライベートビルドの取得 CString GetProductName() 製品名の取得 CString GetSpecialBuild() スペシャルビルドの取得 ~CVersion() デストラクタ */ #ifndef __VERSION_H__ #define __VERSION_H__ #include "winver.h" #pragma comment( linker, "/DEFAULTLIB:version.lib" ) class CVersion { VOID *pData; WORD *pLang; VS_FIXEDFILEINFO *pFixedFileInfo; VOID init( LPTSTR filename ) { DWORD size = GetFileVersionInfoSize( filename, NULL ); pData = new char[size]; UINT len; if( GetFileVersionInfo( filename, NULL, size, pData ) ){ VerQueryValue( pData, "\\", (LPVOID *)&pFixedFileInfo, &len ); VerQueryValue( pData, "\\VarFileInfo\\Translation", (LPVOID *)&pLang, &len ); } } public: CVersion() { HINSTANCE hInstance = AfxGetApp()->m_hInstance; CHAR szFilename[MAX_PATH]; GetModuleFileName( hInstance, szFilename, MAX_PATH ); init( (LPTSTR)szFilename ); } CVersion( CString Filename ) { init( (LPTSTR)(LPCSTR)Filename ); } ~CVersion() { delete [] pData; } CString GetFileVersion() { if( pData == NULL ) return( "" ); CString str; str.Format( "%d.%d.%d Build(%d)", HIWORD( pFixedFileInfo->dwFileVersionMS ), LOWORD( pFixedFileInfo->dwFileVersionMS ), HIWORD( pFixedFileInfo->dwFileVersionLS ), LOWORD( pFixedFileInfo->dwFileVersionLS ) ); return( str ); } CString GetProductVersion() { if( pData == NULL ) return( "" ); CString str; str.Format( "%d.%d.%d Build(%d)", HIWORD( pFixedFileInfo->dwProductVersionMS ), LOWORD( pFixedFileInfo->dwProductVersionMS ), HIWORD( pFixedFileInfo->dwProductVersionLS ), LOWORD( pFixedFileInfo->dwProductVersionLS ) ); return( str ); } CString GetComments() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\Comments", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } CString GetCompanyName() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\CompanyName", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } CString GetFileDescription() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\FileDescription", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } CString GetInternalName() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\InternalName", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } CString GetLegalCopyright() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\LegalCopyright", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } CString GetLegalTrademarks() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\LegalTrademarks", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } CString GetOriginalFilename() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\OriginalFilename", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } CString GetPrivateBuild() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\PrivateBuild", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } CString GetProductName() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\ProductName", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } CString GetSpecialBuild() { if( pData == NULL ) return( "" ); CString SubBlock; SubBlock.Format( "\\StringFileInfo\\%04X%04X\\SpecialBuild", *pLang, *(pLang+1) ); CHAR *p; UINT len; VerQueryValue( pData, (LPTSTR)(LPCSTR)SubBlock, (LPVOID *)&p, &len ); CString str; if( len > 0 ) str = p; else str = ""; return( str ); } }; #endif