///////////////////////////////////////////////////////////////////////////// /* DESCRIPTION: CFileVersionInfo - Class for getting file version information http://www.codeproject.com/file/VersionInfo.asp NOTES: Copyright(C) Armen Hakobyan, 2003 mailto:armen.h@web.am VERSION HISTORY: 25 Jul 2003 - Posted the article 27 Jul 2003 - Added DLLVERSIONINFO2 support to DllGetVersion 21 Jan 2004 - Added GetFileVersionMajor, GetFileVersionMinor, GetFileVersionBuild, GetFileVersionQFE functions 29 Jan 2004 - Added GetProductVersionMajor, GetProductVersionMinor, GetProductVersionBuild, GetProductVersionQFE functions */ ///////////////////////////////////////////////////////////////////////////// #ifndef __VERINFO_H__ #define __VERINFO_H__ #if defined( _MSC_VER ) && ( _MSC_VER >= 1020 ) #pragma once #endif ///////////////////////////////////////////////////////////////////////////// #ifndef _INC_SHLWAPI #include < Shlwapi.h > #endif #pragma comment( lib, "shlwapi.lib" ) #ifndef VER_H #include < WinVer.h > #endif #pragma comment( lib, "Version.lib " ) #ifndef _T #ifndef _INC_TCHAR #include < TChar.h > #endif #endif #ifndef ASSERT #ifndef _INC_CRTDBG #include < CrtDbg.h > #endif #define ASSERT( x ) _ASSERTE( x ) #endif ///////////////////////////////////////////////////////////////////////////// //#define _wslPackVersion( major, minor ) MAKELONG( minor, major ) #ifndef _free #define _free( p ) { if( p != NULL ){ free( p ); p = NULL; } } #endif #ifndef ASSERT_RETURN #define ASSERT_RETURN( x ) { ASSERT( 0 ); return x; } #endif ///////////////////////////////////////////////////////////////////////////// #ifndef DLLVER_MAJOR_MASK typedef struct _DLLVERSIONINFO2 { DLLVERSIONINFO info1; DWORD dwFlags; // No flags currently defined ULONGLONG ullVersion; } DLLVERSIONINFO2; #endif // DLLVER_MAJOR_MASK #ifndef MAKEDLLVERULL #define MAKEDLLVERULL( major, minor, build, qfe )\ ( ( (ULONGLONG)(major) << 48 ) | \ ( (ULONGLONG)(minor) << 32 ) | \ ( (ULONGLONG)(build) << 16 ) | \ ( (ULONGLONG)( qfe) << 0 ) ) #endif // MAKEDLLVERULL ///////////////////////////////////////////////////////////////////////////// STDAPI_( HRESULT ) DllGetVersion( IN HMODULE hModule, OUT DLLVERSIONINFO* lpDVI ); ///////////////////////////////////////////////////////////////////////////// typedef enum _VI_CP { VI_CP_ASCII = 0, // 7-bit ASCII VI_CP_JAPAN = 932, // Japan (Shift - JIS X-0208) VI_CP_KOREA = 949, // Korea (Shift - KSC 5601) VI_CP_TAIWAN = 950, // Taiwan (Big5) VI_CP_UNICODE = 1200, // Unicode VI_CP_LATIN2 = 1250, // Latin-2 (Eastern European) VI_CP_CYRILLIC = 1251, // Cyrillic VI_CP_MULTILNG = 1252, // Multilingual VI_CP_GREEK = 1253, // Greek VI_CP_TURKISH = 1254, // Turkish VI_CP_HEBREW = 1255, // Hebrew VI_CP_ARABIC = 1256 // Arabic } VI_CP; typedef enum _VI_STR { VI_STR_COMMENTS = 0, // Comments VI_STR_COMPANYNAME = 1, // CompanyName VI_STR_FILEDESCRIPTION = 2, // FileDescription VI_STR_FILEVERSION = 3, // FileVersion VI_STR_INTERNALNAME = 4, // InternalName VI_STR_LEGALCOPYRIGHT = 5, // LegalCopyright VI_STR_LEGALTRADEMARKS = 6, // LegalTrademarks VI_STR_ORIGINALFILENAME = 7, // OriginalFilename VI_STR_PRIVATEBUILD = 8, // PrivateBuild VI_STR_PRODUCTNAME = 9, // ProductName VI_STR_PRODUCTVERSION = 10, // ProductVersion VI_STR_SPECIALBUILD = 11, // SpecialBuild VI_STR_OLESELFREGISTER = 12 // OLESelfRegister } VI_STR; /* HIWORD( m_vsffi.dwFileVersionMS ) LOWORD( m_vsffi.dwFileVersionMS ) HIWORD( m_vsffi.dwFileVersionLS ) LOWORD( m_vsffi.dwFileVersionLS ) */ class CFileVersionInfo { public: // Construction/destruction: CFileVersionInfo( void ); virtual ~CFileVersionInfo( void ); public: // Implementation: BOOL Open( IN LPCTSTR lpszFileName ); BOOL Open( IN HINSTANCE hInstance ); void Close( void ); BOOL QueryStringValue( IN LPCTSTR lpszString, OUT LPTSTR lpszValue, IN INT nBuf ) const; BOOL QueryStringValue( IN INT nIndex, OUT LPTSTR lpszValue, IN INT nBuf ) const; LPCTSTR GetVerStringName( IN INT nIndex ); BOOL SetTrans ( IN LANGID wLID = LANG_NEUTRAL, IN WORD wCP = VI_CP_UNICODE ); BOOL SetTransIndex( IN UINT nIndex = 0 ); INT FindTrans( IN LANGID wLID, IN WORD wCP ) const; DWORD GetTransByIndex( IN UINT nIndex ) const; public: // Static members: static BOOL GetLIDName( IN WORD wLID, OUT LPTSTR lpszName, IN INT nBuf ); static BOOL GetCPName( IN WORD wCP, OUT LPCTSTR* ppszName ); //static DWORD InstallFile( void ); public: // Inline members inline const VS_FIXEDFILEINFO& GetVSFFI( void ) const; inline BOOL IsValid( void ) const; inline WORD GetFileVersionMajor( void ) const; inline WORD GetFileVersionMinor( void ) const; inline WORD GetFileVersionBuild( void ) const; inline WORD GetFileVersionQFE( void ) const; inline WORD GetProductVersionMajor( void ) const; inline WORD GetProductVersionMinor( void ) const; inline WORD GetProductVersionBuild( void ) const; inline WORD GetProductVersionQFE( void ) const; inline UINT GetTransCount( void ) const; inline UINT GetCurTransIndex( void ) const; inline LANGID GetLIDByIndex( IN UINT nIndex ) const; inline WORD GetCPByIndex( IN UINT nIndex ) const; inline DWORD GetCurTrans( void ) const; inline LANGID GetCurLID( void ) const; inline WORD GetCurCP( void ) const; protected: BOOL GetVersionInfo( IN LPCTSTR lpszFileName ); BOOL QueryVersionTrans( void ); protected: // Members variables static LPCTSTR s_ppszStr[ 13 ]; // String names VS_FIXEDFILEINFO m_vsffi; // Fixed File Info (FFI) LPBYTE m_lpbyVIB; // Pointer to version info block (VIB) LPDWORD m_lpdwTrans; // Pointer to translation array in m_lpbyVIB, LOWORD = LangID and HIWORD = CodePage UINT m_nTransCur; // Current translation index UINT m_nTransCnt; // Translations count BOOL m_bValid; // Version info is loaded }; //////////////////////////////////////////////////////////////////////////////// inline BOOL CFileVersionInfo::IsValid( void ) const { return m_bValid; } inline const VS_FIXEDFILEINFO& CFileVersionInfo::GetVSFFI( void ) const { return m_vsffi; } //////////////////////////////////////////////////////////////////////////////// inline WORD CFileVersionInfo::GetFileVersionMajor( void ) const { ASSERT( m_bValid ); return HIWORD( m_vsffi.dwFileVersionMS ); } inline WORD CFileVersionInfo::GetFileVersionMinor( void ) const { ASSERT( m_bValid ); return LOWORD( m_vsffi.dwFileVersionMS ); } inline WORD CFileVersionInfo::GetFileVersionBuild( void ) const { ASSERT( m_bValid ); return HIWORD( m_vsffi.dwFileVersionLS ); } inline WORD CFileVersionInfo::GetFileVersionQFE( void ) const { ASSERT( m_bValid ); return LOWORD( m_vsffi.dwFileVersionLS ); } inline WORD CFileVersionInfo::GetProductVersionMajor( void ) const { ASSERT( m_bValid ); return HIWORD( m_vsffi.dwProductVersionMS ); } inline WORD CFileVersionInfo::GetProductVersionMinor( void ) const { ASSERT( m_bValid ); return LOWORD( m_vsffi.dwProductVersionMS ); } inline WORD CFileVersionInfo::GetProductVersionBuild( void ) const { ASSERT( m_bValid ); return HIWORD( m_vsffi.dwProductVersionLS ); } inline WORD CFileVersionInfo::GetProductVersionQFE( void ) const { ASSERT( m_bValid ); return LOWORD( m_vsffi.dwProductVersionLS ); } //////////////////////////////////////////////////////////////////////////////// // Translation functions inline UINT CFileVersionInfo::GetTransCount( void ) const { ASSERT( m_bValid ); return m_nTransCnt; } inline UINT CFileVersionInfo::GetCurTransIndex( void ) const { ASSERT( m_bValid ); return m_nTransCur; } inline LANGID CFileVersionInfo::GetLIDByIndex( IN UINT nIndex ) const { return LOWORD( GetTransByIndex( nIndex ) ); } inline WORD CFileVersionInfo::GetCPByIndex( IN UINT nIndex ) const { return HIWORD( GetTransByIndex( nIndex ) ); } inline DWORD CFileVersionInfo::GetCurTrans( void ) const { return GetTransByIndex( GetCurTransIndex() ); } inline LANGID CFileVersionInfo::GetCurLID( void ) const { return GetLIDByIndex( GetCurTransIndex() ); } inline WORD CFileVersionInfo::GetCurCP( void ) const { return GetCPByIndex( GetCurTransIndex() ); } ///////////////////////////////////////////////////////////////////////////// #endif //__VER_H__ /////////////////////////////////////////////////////////////////////////////