CHAR szAppPath[ MAX_PATH ] = { 0 };
::GetModuleFileName( NULL, szAppPath, MAX_PATH );
INT nVersionLen = ::GetFileVersionInfoSize( szAppPath, NULL );
if ( nVersionLen <= 0 )
{
return FALSE;
}
CHAR* pBuffer = new CHAR[ nVersionLen ];
if ( !pBuffer )
{
return FALSE;
}
if ( !::GetFileVersionInfo( szAppPath, NULL, nVersionLen, pBuffer ) )
{
return FALSE;
}
// 为了方便访问。
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
// Read the list of languages and code pages.
UINT cbTranslate;
::VerQueryValue( pBuffer, "//VarFileInfo//Translation ",
(LPVOID*)&lpTranslate, &cbTranslate );
// Read the file description for each language and code page.
// 资源的各种名称
//CHAR* szVersion[] = {
// "Comments ", "InternalName ", "ProductName ",
// "CompanyName ", "LegalCopyright ", "ProductVersion ",
// "FileDescription ", "LegalTrademarks ", "PrivateBuild ",
// "FileVersion ", "OriginalFilename ", "SpecialBuild "
//};
// dwBytes最大值应该是301.
// 应用仅仅允许输入最多300个字符:)
UINT dwBytes;
CHAR* lpBuffer;
CHAR szSubBlock[256];
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//Comments ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strComment = lpBuffer;
}
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//InternalName ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strInternalName = lpBuffer;
}
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//ProductName ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strProductName = lpBuffer;
}
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//CompanyName ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strCompanyName = lpBuffer;
}
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//LegalCopyright ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strLegalCopyRight = lpBuffer;
}
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//ProductVersion ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strProductVersion = lpBuffer;
}
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//FileDescription ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strFileDescription = lpBuffer;
}
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//FileVersion ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strFileVersion = lpBuffer;
}
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//PrivateBuild ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strPrivateBuild = lpBuffer;
}
_snprintf( szSubBlock, 256, "//StringFileInfo//%04x%04x//OriginalFilename ",
lpTranslate[0].wLanguage, lpTranslate[0].wCodePage );
if( ::VerQueryValue( pBuffer, szSubBlock, ( LPVOID* )&lpBuffer, &dwBytes ) )
{
m_stAppVersion.strOriginalFilename = lpBuffer;
}
delete[] pBuffer;
return TRUE;