home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Multimedia / AVStoDVD / AVStoDVD_280_Install.exe / AVSMeter / source / VerInfo.h < prev   
C/C++ Source or Header  |  2014-10-16  |  17KB  |  607 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. /* 
  3. DESCRIPTION:
  4.     CFileVersionInfo - Class for getting file version information
  5.     http://www.codeproject.com/file/VersionInfo.asp
  6.  
  7. NOTES:
  8.     Copyright(C) Armen Hakobyan, 2003
  9.     mailto:armen.h@web.am
  10.     
  11. VERSION HISTORY:
  12.     25 Jul 2003 - Posted the article
  13.     27 Jul 2003 - Added DLLVERSIONINFO2 support to DllGetVersion
  14.     21 Jan 2004 - Added GetFileVersionMajor, GetFileVersionMinor,
  15.                   GetFileVersionBuild, GetFileVersionQFE functions
  16.     29 Jan 2004 - Added GetProductVersionMajor, GetProductVersionMinor,
  17.                   GetProductVersionBuild, GetProductVersionQFE functions
  18. */
  19. /////////////////////////////////////////////////////////////////////////////
  20.  
  21. #ifndef __VERINFO_H__ 
  22. #define __VERINFO_H__
  23.  
  24. #if defined( _MSC_VER ) && ( _MSC_VER >= 1020 )
  25.     #pragma once
  26. #endif
  27.  
  28. /////////////////////////////////////////////////////////////////////////////
  29.  
  30. #ifndef    _INC_SHLWAPI
  31.     #include < Shlwapi.h >
  32. #endif
  33. #pragma comment( lib, "shlwapi.lib" )
  34.  
  35. #ifndef VER_H
  36.     #include < WinVer.h >
  37. #endif
  38.  
  39. #ifndef _T
  40.     #ifndef _INC_TCHAR
  41.         #include < TChar.h >
  42.     #endif
  43. #endif
  44.  
  45. #ifndef    ASSERT
  46.     #ifndef _INC_CRTDBG
  47.         #include < CrtDbg.h >
  48.     #endif
  49.     #define ASSERT( x )            _ASSERTE( x )
  50. #endif
  51.  
  52. /////////////////////////////////////////////////////////////////////////////
  53.  
  54. //#define _wslPackVersion( major, minor )        MAKELONG( minor, major )
  55.  
  56. #ifndef        _free
  57.     #define _free( p )            { if( p != NULL ){ free( p ); p = NULL; } }
  58. #endif
  59.  
  60. #ifndef        ASSERT_RETURN
  61.     #define ASSERT_RETURN( x )    { ASSERT( 0 ); return x; }
  62. #endif
  63.  
  64. /////////////////////////////////////////////////////////////////////////////
  65.  
  66. #ifndef DLLVER_MAJOR_MASK
  67.  
  68.     typedef struct _DLLVERSIONINFO2 {
  69.         DLLVERSIONINFO    info1;
  70.         DWORD            dwFlags;                // No flags currently defined
  71.         ULONGLONG        ullVersion;
  72.     } DLLVERSIONINFO2;
  73.  
  74. #endif // DLLVER_MAJOR_MASK
  75.  
  76. #ifndef MAKEDLLVERULL
  77.  
  78.     #define MAKEDLLVERULL( major, minor, build, qfe )\
  79.         ( ( (ULONGLONG)(major) << 48 ) |             \
  80.         (   (ULONGLONG)(minor) << 32 ) |             \
  81.         (   (ULONGLONG)(build) << 16 ) |             \
  82.         (   (ULONGLONG)(  qfe) <<  0 ) )
  83.  
  84. #endif // MAKEDLLVERULL
  85.  
  86.  
  87. /////////////////////////////////////////////////////////////////////////////
  88.  
  89. STDAPI_( HRESULT ) DllGetVersion( IN HMODULE hModule, OUT DLLVERSIONINFO* lpDVI );
  90.  
  91. /////////////////////////////////////////////////////////////////////////////
  92.  
  93. typedef enum _VI_CP {
  94.     VI_CP_ASCII                = 0,    // 7-bit ASCII 
  95.     VI_CP_JAPAN                = 932,    // Japan (Shift - JIS X-0208) 
  96.     VI_CP_KOREA                = 949,    // Korea (Shift - KSC 5601) 
  97.     VI_CP_TAIWAN            = 950,    // Taiwan (Big5) 
  98.     VI_CP_UNICODE            = 1200,    // Unicode 
  99.     VI_CP_LATIN2            = 1250,    // Latin-2 (Eastern European) 
  100.     VI_CP_CYRILLIC            = 1251,    // Cyrillic 
  101.     VI_CP_MULTILNG            = 1252,    // Multilingual 
  102.     VI_CP_GREEK                = 1253,    // Greek 
  103.     VI_CP_TURKISH            = 1254,    // Turkish 
  104.     VI_CP_HEBREW            = 1255,    // Hebrew 
  105.     VI_CP_ARABIC            = 1256    // Arabic 
  106. } VI_CP;
  107.  
  108. typedef enum _VI_STR {
  109.     VI_STR_COMMENTS            = 0,    // Comments
  110.     VI_STR_COMPANYNAME        = 1,    // CompanyName
  111.     VI_STR_FILEDESCRIPTION    = 2,    // FileDescription
  112.     VI_STR_FILEVERSION        = 3,    // FileVersion
  113.     VI_STR_INTERNALNAME        = 4,    // InternalName
  114.     VI_STR_LEGALCOPYRIGHT    = 5,    // LegalCopyright
  115.     VI_STR_LEGALTRADEMARKS    = 6,    // LegalTrademarks
  116.     VI_STR_ORIGINALFILENAME    = 7,    // OriginalFilename
  117.     VI_STR_PRIVATEBUILD        = 8,    // PrivateBuild
  118.     VI_STR_PRODUCTNAME        = 9,    // ProductName
  119.     VI_STR_PRODUCTVERSION    = 10,    // ProductVersion
  120.     VI_STR_SPECIALBUILD        = 11,    // SpecialBuild
  121.     VI_STR_OLESELFREGISTER    = 12    // OLESelfRegister
  122. } VI_STR;
  123.  
  124. /*
  125. HIWORD( m_vsffi.dwFileVersionMS )
  126. LOWORD( m_vsffi.dwFileVersionMS )
  127. HIWORD( m_vsffi.dwFileVersionLS )
  128. LOWORD( m_vsffi.dwFileVersionLS )
  129. */
  130.  
  131. class CFileVersionInfo
  132. {
  133. public:    // Construction/destruction:
  134.  
  135.     CFileVersionInfo( void );    
  136.     virtual ~CFileVersionInfo( void );
  137.  
  138. public:    // Implementation:
  139.     
  140.     BOOL    Open( IN LPCTSTR lpszFileName );
  141.     BOOL    Open( IN HINSTANCE hInstance );
  142.     void    Close( void );
  143.  
  144.     BOOL    QueryStringValue( IN LPCTSTR lpszString, OUT LPTSTR lpszValue, IN INT nBuf ) const;
  145.     BOOL    QueryStringValue( IN INT nIndex, OUT LPTSTR lpszValue, IN INT nBuf ) const;
  146.     LPCTSTR    GetVerStringName( IN INT nIndex );    
  147.  
  148.     BOOL    SetTrans ( IN LANGID wLID = LANG_NEUTRAL, IN WORD wCP = VI_CP_UNICODE );    
  149.     BOOL    SetTransIndex( IN UINT nIndex = 0 );
  150.     INT        FindTrans( IN LANGID wLID, IN WORD wCP ) const;
  151.     DWORD    GetTransByIndex( IN UINT nIndex  ) const;    
  152.  
  153. public: // Static members:
  154.     
  155.     static BOOL        GetLIDName( IN WORD wLID, OUT LPTSTR lpszName, IN INT nBuf );
  156.     static BOOL        GetCPName( IN WORD wCP, OUT LPCTSTR* ppszName );
  157.     //static DWORD    InstallFile( void );
  158.     
  159. public: // Inline members
  160.  
  161.     inline const    VS_FIXEDFILEINFO& GetVSFFI( void ) const;        
  162.     inline BOOL        IsValid( void ) const;
  163.  
  164.     inline WORD        GetFileVersionMajor( void ) const;
  165.     inline WORD        GetFileVersionMinor( void ) const;
  166.     inline WORD        GetFileVersionBuild( void ) const;
  167.     inline WORD        GetFileVersionQFE( void )   const;
  168.  
  169.     inline WORD        GetProductVersionMajor( void ) const;
  170.     inline WORD        GetProductVersionMinor( void ) const;
  171.     inline WORD        GetProductVersionBuild( void ) const;
  172.     inline WORD        GetProductVersionQFE( void )   const;
  173.     
  174.     inline UINT        GetTransCount( void ) const;
  175.     inline UINT        GetCurTransIndex( void ) const;        
  176.     inline LANGID    GetLIDByIndex( IN UINT nIndex ) const;    
  177.     inline WORD        GetCPByIndex( IN UINT nIndex ) const;    
  178.     inline DWORD    GetCurTrans( void ) const;        
  179.     inline LANGID    GetCurLID( void ) const;    
  180.     inline WORD        GetCurCP( void ) const;
  181.  
  182. protected:
  183.  
  184.     BOOL    GetVersionInfo( IN LPCTSTR lpszFileName );
  185.     BOOL    QueryVersionTrans( void );
  186.  
  187. protected: // Members variables
  188.     
  189.     static LPCTSTR     s_ppszStr[ 13 ];    // String names
  190.     VS_FIXEDFILEINFO m_vsffi;            // Fixed File Info (FFI)
  191.  
  192.     LPBYTE        m_lpbyVIB;        // Pointer to version info block (VIB)
  193.     LPDWORD        m_lpdwTrans;    // Pointer to translation array in m_lpbyVIB, LOWORD = LangID and HIWORD = CodePage    
  194.     UINT        m_nTransCur;    // Current translation index
  195.     UINT        m_nTransCnt;    // Translations count
  196.     BOOL        m_bValid;        // Version info is loaded    
  197. };
  198.  
  199. ////////////////////////////////////////////////////////////////////////////////
  200.  
  201. inline BOOL CFileVersionInfo::IsValid( void ) const
  202.     { return m_bValid; }
  203.  
  204. inline const VS_FIXEDFILEINFO& CFileVersionInfo::GetVSFFI( void ) const
  205.     { return m_vsffi; }
  206.  
  207. ////////////////////////////////////////////////////////////////////////////////
  208.  
  209. inline WORD CFileVersionInfo::GetFileVersionMajor( void ) const
  210.     { ASSERT( m_bValid ); return HIWORD( m_vsffi.dwFileVersionMS ); }
  211.  
  212. inline WORD CFileVersionInfo::GetFileVersionMinor( void ) const
  213.     { ASSERT( m_bValid ); return LOWORD( m_vsffi.dwFileVersionMS ); }
  214.  
  215. inline WORD CFileVersionInfo::GetFileVersionBuild( void ) const
  216.     { ASSERT( m_bValid ); return HIWORD( m_vsffi.dwFileVersionLS ); }
  217.  
  218. inline WORD CFileVersionInfo::GetFileVersionQFE( void ) const
  219.     { ASSERT( m_bValid ); return LOWORD( m_vsffi.dwFileVersionLS ); }
  220.  
  221. inline WORD CFileVersionInfo::GetProductVersionMajor( void ) const
  222.     { ASSERT( m_bValid ); return HIWORD( m_vsffi.dwProductVersionMS ); }
  223.  
  224. inline WORD CFileVersionInfo::GetProductVersionMinor( void ) const
  225.     { ASSERT( m_bValid ); return LOWORD( m_vsffi.dwProductVersionMS ); }
  226.  
  227. inline WORD CFileVersionInfo::GetProductVersionBuild( void ) const
  228.     { ASSERT( m_bValid ); return HIWORD( m_vsffi.dwProductVersionLS ); }
  229.  
  230. inline WORD CFileVersionInfo::GetProductVersionQFE( void ) const
  231.     { ASSERT( m_bValid ); return LOWORD( m_vsffi.dwProductVersionLS ); }
  232.  
  233. ////////////////////////////////////////////////////////////////////////////////
  234. // Translation functions
  235.  
  236. inline UINT CFileVersionInfo::GetTransCount( void ) const
  237.     { ASSERT( m_bValid ); return m_nTransCnt; }
  238.  
  239. inline UINT CFileVersionInfo::GetCurTransIndex( void ) const
  240.     { ASSERT( m_bValid ); return m_nTransCur; }
  241.  
  242. inline LANGID CFileVersionInfo::GetLIDByIndex( IN UINT nIndex  ) const
  243.     { return LOWORD( GetTransByIndex( nIndex ) ); }    
  244.  
  245. inline WORD CFileVersionInfo::GetCPByIndex( IN UINT nIndex  ) const
  246.     { return HIWORD( GetTransByIndex( nIndex ) ); }    
  247.  
  248. inline DWORD CFileVersionInfo::GetCurTrans( void ) const
  249.     { return GetTransByIndex( GetCurTransIndex() ); }
  250.  
  251. inline LANGID CFileVersionInfo::GetCurLID( void ) const
  252.     { return GetLIDByIndex( GetCurTransIndex() ); }
  253.  
  254. inline WORD CFileVersionInfo::GetCurCP( void ) const
  255.     { return GetCPByIndex( GetCurTransIndex() ); }
  256.     
  257.  
  258. static HRESULT STDAPICALLTYPE DllGetVersion( IN  HMODULE hModule, 
  259.                                       OUT DLLVERSIONINFO* lpDVI )
  260. {
  261.     if( hModule == NULL || 
  262.         ::IsBadReadPtr( lpDVI, sizeof( DLLVERSIONINFO* ) ) )
  263.     {
  264.         ASSERT_RETURN( S_FALSE );
  265.     }
  266.  
  267.     CONST DWORD cbSize = lpDVI->cbSize;
  268.  
  269.     if(
  270. #ifdef DLLVERSIONINFO2
  271.         (
  272. #endif
  273.         cbSize != sizeof( DLLVERSIONINFO  )
  274. #ifdef DLLVERSIONINFO2
  275.         && cbSize != sizeof( DLLVERSIONINFO2 ) ) 
  276. #endif
  277.         || ::IsBadWritePtr( lpDVI, cbSize ) )
  278.     {
  279.         ASSERT_RETURN( S_FALSE );
  280.     }
  281.  
  282.     ::ZeroMemory( lpDVI, cbSize );
  283.     lpDVI->cbSize = cbSize;
  284.     
  285.     CFileVersionInfo fvi;
  286.     if( fvi.Open( hModule ) )
  287.     {
  288.         VS_FIXEDFILEINFO vsffi = fvi.GetVSFFI();
  289.  
  290.         if( vsffi.dwFileType == VFT_DLL ||
  291.             vsffi.dwFileType == VFT_STATIC_LIB )
  292.         {
  293.             switch( vsffi.dwFileOS )
  294.             {            
  295.             case VOS__WINDOWS32:
  296.             case VOS_NT_WINDOWS32:
  297.                 lpDVI->dwPlatformID = DLLVER_PLATFORM_WINDOWS;
  298.                 break;
  299.             case VOS_NT:
  300.                 lpDVI->dwPlatformID = DLLVER_PLATFORM_NT;
  301.                 break;            
  302.             default:
  303.                 return ( S_FALSE );
  304.             }
  305.             
  306.             lpDVI->dwMajorVersion = HIWORD( vsffi.dwFileVersionMS );
  307.             lpDVI->dwMinorVersion = LOWORD( vsffi.dwFileVersionMS );
  308.             lpDVI->dwBuildNumber  = HIWORD( vsffi.dwFileVersionLS );
  309.             
  310.         #ifdef DLLVERSIONINFO2
  311.  
  312.             if( cbSize == sizeof( DLLVERSIONINFO2 ) )
  313.             {
  314.                 DLLVERSIONINFO2* lpDVI2 = (DLLVERSIONINFO2*)lpDVI;
  315.                 lpDVI2->ullVersion = MAKEDLLVERULL( 
  316.                     lpDVI->dwMajorVersion,
  317.                     lpDVI->dwMinorVersion,
  318.                     lpDVI->dwBuildNumber ,
  319.                     LOWORD( vsffi.dwFileVersionLS )
  320.                 );
  321.             }
  322.  
  323.         #endif
  324.  
  325.             return ( S_OK );
  326.         }
  327.     #ifdef _DEBUG
  328.         else
  329.             ASSERT( 0 );
  330.     #endif
  331.  
  332.         fvi.Close();
  333.     }
  334.  
  335.     return ( S_FALSE );
  336. }
  337.  
  338. /////////////////////////////////////////////////////////////////////////////
  339. // HIWORD( ffi.dwFileVersionMS ) - major
  340. // LOWORD( ffi.dwFileVersionMS ) - minor
  341. // HIWORD( ffi.dwFileVersionLS ) - build
  342. // LOWORD( ffi.dwFileVersionLS ) - QFE
  343. /////////////////////////////////////////////////////////////////////////////
  344.  
  345. CFileVersionInfo::CFileVersionInfo( void )
  346.                 : m_lpbyVIB( NULL )
  347. {        
  348.     Close();
  349. }
  350.  
  351. CFileVersionInfo::~CFileVersionInfo( void )
  352. {
  353.     Close();
  354. }
  355.  
  356. LPCTSTR CFileVersionInfo::s_ppszStr[] = { 
  357.     _T( "Comments" ),            _T( "CompanyName" ),      
  358.     _T( "FileDescription" ),    _T( "FileVersion" ),
  359.     _T( "InternalName" ),        _T( "LegalCopyright" ),
  360.     _T( "LegalTrademarks" ),    _T( "OriginalFilename" ),
  361.     _T( "PrivateBuild" ),        _T( "ProductName" ),
  362.     _T( "ProductVersion" ),        _T( "SpecialBuild" ),
  363.     _T( "OLESelfRegister" )
  364. };
  365.  
  366. ////////////////////////////////////////////////////////////////////////////////
  367. // Implementation
  368.  
  369. BOOL CFileVersionInfo::Open( IN HINSTANCE hInstance )
  370. {
  371.     if( hInstance == NULL )
  372.         ASSERT_RETURN( FALSE );
  373.  
  374.     TCHAR szFileName[ MAX_PATH ] = { 0 };
  375.     if( ::GetModuleFileName( hInstance, szFileName, MAX_PATH ) )
  376.         return Open( szFileName );
  377.  
  378.     return FALSE;
  379. };
  380.  
  381. BOOL CFileVersionInfo::Open( IN LPCTSTR lpszFileName )
  382. {
  383.     if( lpszFileName == NULL )
  384.         ASSERT_RETURN( FALSE );
  385.  
  386.     Close();
  387.     if( !GetVersionInfo( lpszFileName ) || !QueryVersionTrans() )
  388.         Close();
  389.  
  390.     return m_bValid;
  391. };
  392.  
  393. BOOL CFileVersionInfo::GetVersionInfo( IN LPCTSTR lpszFileName )
  394. {
  395.     DWORD dwDummy = 0;
  396.     DWORD dwSize  = ::GetFileVersionInfoSize( 
  397.         const_cast< LPTSTR >( lpszFileName ), &dwDummy // Set to 0
  398.     );
  399.  
  400.     if ( dwSize > 0 )
  401.     {        
  402.         m_lpbyVIB = (LPBYTE)malloc( dwSize );
  403.  
  404.         if ( m_lpbyVIB != NULL && 
  405.             ::GetFileVersionInfo( const_cast< LPTSTR >( lpszFileName ), 
  406.             0, dwSize, m_lpbyVIB ) )
  407.         {
  408.             UINT   uLen    = 0;
  409.             LPVOID lpVSFFI = NULL;
  410.             
  411.             if ( ::VerQueryValue( m_lpbyVIB, _T( "\\" ), (LPVOID*)&lpVSFFI, &uLen ) )
  412.             {
  413.                 ::CopyMemory( &m_vsffi, lpVSFFI, sizeof( VS_FIXEDFILEINFO ) );
  414.                 m_bValid = ( m_vsffi.dwSignature == VS_FFI_SIGNATURE );
  415.             }
  416.         }
  417.     }
  418.  
  419.     return m_bValid;
  420. }
  421.  
  422. BOOL CFileVersionInfo::QueryVersionTrans( void )
  423. {
  424.     if( m_bValid == FALSE )
  425.         ASSERT_RETURN( FALSE );
  426.  
  427.     UINT   uLen  = 0;
  428.     LPVOID lpBuf = NULL;
  429.   
  430.     if( ::VerQueryValue( m_lpbyVIB, _T( "\\VarFileInfo\\Translation" ), (LPVOID*)&lpBuf, &uLen ) )
  431.     {
  432.         m_lpdwTrans = (LPDWORD)lpBuf;
  433.         m_nTransCnt = ( uLen / sizeof( DWORD ) );        
  434.     }    
  435.     return (BOOL)( m_lpdwTrans != NULL );
  436. }
  437.  
  438. void CFileVersionInfo::Close( void )
  439. {
  440.     m_nTransCnt  = 0;
  441.     m_nTransCur  = 0;
  442.     m_bValid     = FALSE;    
  443.     m_lpdwTrans  = NULL;
  444.         
  445.     ::ZeroMemory( &m_vsffi, sizeof( VS_FIXEDFILEINFO ) );
  446.     _free( m_lpbyVIB );
  447. }
  448.  
  449. BOOL CFileVersionInfo::QueryStringValue( IN  LPCTSTR lpszItem,
  450.                                          OUT LPTSTR  lpszValue, 
  451.                                          IN  INT     nBuf ) const
  452. {
  453.     if( m_bValid  == FALSE || lpszItem == NULL )
  454.         ASSERT_RETURN( FALSE );
  455.     
  456.     if( lpszValue != NULL && nBuf <= 0 )
  457.         ASSERT_RETURN( FALSE );
  458.  
  459.     ::ZeroMemory( lpszValue, nBuf * sizeof( TCHAR ) );
  460.  
  461.     TCHAR szSFI[ MAX_PATH ] = { 0 };
  462.     ::_stprintf( szSFI, _T( "\\StringFileInfo\\%04X%04X\\%s" ), 
  463.         GetCurLID(), GetCurCP(), lpszItem );
  464.  
  465.     BOOL   bRes    = FALSE;
  466.     UINT   uLen    = 0;
  467.     LPTSTR lpszBuf = NULL;
  468.  
  469.     if( ::VerQueryValue( m_lpbyVIB, (LPTSTR)szSFI, (LPVOID*)&lpszBuf, &uLen ) )
  470.     {
  471.         if( lpszValue != NULL && nBuf > 0 )
  472.             bRes = (BOOL)( ::lstrcpyn( lpszValue, lpszBuf, nBuf ) != NULL );
  473.         else
  474.             bRes = TRUE;
  475.     }
  476.     
  477.     return ( bRes );
  478. }
  479.  
  480. BOOL CFileVersionInfo::QueryStringValue( IN  INT    nIndex, 
  481.                                          OUT LPTSTR lpszValue,
  482.                                          IN  INT    nBuf ) const
  483. {
  484.     if( nIndex < VI_STR_COMMENTS || 
  485.         nIndex > VI_STR_OLESELFREGISTER ) 
  486.     { 
  487.         ASSERT_RETURN( FALSE );
  488.     }    
  489.     return QueryStringValue( s_ppszStr[ nIndex ], lpszValue, nBuf );
  490. }
  491.  
  492. LPCTSTR CFileVersionInfo::GetVerStringName( IN INT nIndex )
  493.     if( nIndex < VI_STR_COMMENTS || 
  494.         nIndex > VI_STR_OLESELFREGISTER ) 
  495.     { 
  496.         ASSERT_RETURN( FALSE );
  497.     }
  498.     return (LPCTSTR)s_ppszStr[ nIndex ];
  499. }
  500.  
  501. INT CFileVersionInfo::FindTrans( IN LANGID wLID,
  502.                                  IN WORD   wCP ) const
  503. {    
  504.     if( m_bValid == FALSE )
  505.         ASSERT_RETURN( -1 );
  506.  
  507.     for( UINT n = 0; n < m_nTransCnt; n++ )
  508.     {
  509.         if( LOWORD( m_lpdwTrans[ n ] ) == wLID && 
  510.             HIWORD( m_lpdwTrans[ n ] ) == wCP  )
  511.         {        
  512.             return n;
  513.         }
  514.     }
  515.     return -1;
  516. }
  517.  
  518. BOOL CFileVersionInfo::SetTrans( IN LANGID wLID /*LANG_NEUTRAL*/, 
  519.                                  IN WORD   wCP  /*WSLVI_CP_UNICODE*/ )
  520. {    
  521.     if( m_bValid == FALSE )
  522.         ASSERT_RETURN( FALSE );
  523.  
  524.     if( GetCurLID() == wLID && GetCurCP() == wCP )
  525.         return TRUE;
  526.  
  527.     INT nPos = FindTrans( wLID, wCP );
  528.     if( nPos != -1 ) m_nTransCur = nPos;
  529.  
  530.     return ( m_nTransCur == (UINT)nPos );
  531. }
  532.  
  533. DWORD CFileVersionInfo::GetTransByIndex( IN UINT nIndex ) const
  534. {
  535.     if( m_bValid == FALSE || nIndex > m_nTransCnt )
  536.         ASSERT_RETURN( 0 );
  537.  
  538.     return m_lpdwTrans[ nIndex ];
  539. }
  540.  
  541. BOOL CFileVersionInfo::SetTransIndex( IN UINT nIndex /*0*/ )
  542. {
  543.     if( m_bValid == FALSE )
  544.         ASSERT_RETURN( FALSE );
  545.  
  546.     if( m_nTransCur == nIndex )
  547.         return TRUE;
  548.  
  549.     if(nIndex <= m_nTransCnt)
  550.         m_nTransCur = nIndex;
  551.     
  552.     return ( m_nTransCur == nIndex );
  553. }
  554.  
  555. /////////////////////////////////////////////////////////////////////////////
  556. // Static members
  557.  
  558. // If the LID identifier is unknown, it returns a 
  559. // default string ("Language Neutral"):
  560.  
  561. BOOL CFileVersionInfo::GetLIDName( IN  WORD   wLID, 
  562.                                    OUT LPTSTR lpszName, 
  563.                                    IN  INT    nBuf )
  564. {
  565.     if( lpszName == NULL || nBuf <= 0 )
  566.         ASSERT_RETURN( FALSE );
  567.  
  568.     return (BOOL)::VerLanguageName( wLID, lpszName, nBuf );
  569. }
  570.  
  571. // If the CP identifier is unknown, it returns a 
  572. // default string ("Unknown"):
  573.  
  574. BOOL CFileVersionInfo::GetCPName( IN  WORD       wCP,
  575.                                   OUT LPCTSTR* ppszName )
  576. {
  577.     if( ppszName == NULL )
  578.         ASSERT_RETURN( FALSE );
  579.  
  580.     BOOL bRes = TRUE;    
  581.     *ppszName  = NULL;
  582.  
  583.     switch ( wCP )
  584.     {
  585.         case VI_CP_ASCII:     *ppszName = _T( "7-bit ASCII" );                break;
  586.         case VI_CP_JAPAN:     *ppszName = _T( "Japan (Shift û JIS X-0208)" );break;
  587.         case VI_CP_KOREA:     *ppszName = _T( "Korea (Shift û KSC 5601)" );    break;
  588.         case VI_CP_TAIWAN:     *ppszName = _T( "Taiwan (Big5)" );                break;
  589.         case VI_CP_UNICODE:     *ppszName = _T( "Unicode" );                    break;
  590.         case VI_CP_LATIN2:     *ppszName = _T( "Latin-2 (Eastern European)" );break;
  591.         case VI_CP_CYRILLIC: *ppszName = _T( "Cyrillic" );                    break;
  592.         case VI_CP_MULTILNG: *ppszName = _T( "Multilingual" );                break;
  593.         case VI_CP_GREEK:     *ppszName = _T( "Greek" );                        break;
  594.         case VI_CP_TURKISH:     *ppszName = _T( "Turkish" );                    break;
  595.         case VI_CP_HEBREW:     *ppszName = _T( "Hebrew" );                    break;
  596.         case VI_CP_ARABIC:     *ppszName = _T( "Arabic" );                    break;        
  597.         default:             *ppszName = _T( "Unknown" ); bRes = FALSE;        break;
  598.     }
  599.     return bRes;
  600. }
  601.  
  602.  
  603. /////////////////////////////////////////////////////////////////////////////
  604. #endif //__VER_H__
  605. /////////////////////////////////////////////////////////////////////////////
  606.