bool GetFileVersion( std::string sFile, std::string &sOut ) { do { // Cast away const to work around header bug in VC6. DWORD ignore; DWORD iSize = GetFileVersionInfoSize( const_cast<char *>(sFile.c_str()), &ignore ); if( !iSize ) break; std::string VersionBuffer( iSize, ' ' ); // Also VC6: if( !GetFileVersionInfo( const_cast<char *>(sFile.c_str()), NULL, iSize, const_cast<char *>(VersionBuffer.c_str()) ) ) break; WORD *iTrans; UINT iTransCnt; if( !VerQueryValue( (void *) VersionBuffer.c_str() , "\\VarFileInfo\\Translation", (void **) &iTrans, &iTransCnt ) ) break; if( iTransCnt == 0 ) break; char *str; UINT len; std::string sRes = fmt::sprintf( "\\StringFileInfo\\%04x%04x\\FileVersion", iTrans[0], iTrans[1] ); if( !VerQueryValue( (void *) VersionBuffer.c_str(), (char *) sRes.c_str(), (void **) &str, &len ) || len < 1) break; sOut = std::string( str, len-1 ); } while(0); // Get the size and date. struct stat st; if( stat( sFile.c_str(), &st ) != -1 ) { struct tm t; gmtime_r( &st.st_mtime, &t ); if( !sOut.empty() ) sOut += " "; sOut += fmt::sprintf( "[%ib, %02i-%02i-%04i]", st.st_size, t.tm_mon+1, t.tm_mday, t.tm_year+1900 ); } return true; }
bool GetFileVersion( CString fn, CString &out ) { do { DWORD ignore; DWORD iSize = GetFileVersionInfoSize( (char *) fn.c_str(), &ignore ); if( !iSize ) break; CString VersionBuffer( iSize, ' ' ); if( !GetFileVersionInfo( (char *) fn.c_str(), NULL, iSize, (char *) VersionBuffer.c_str() ) ) break; WORD *iTrans; UINT iTransCnt; if( !VerQueryValue( (void *) VersionBuffer.c_str() , "\\VarFileInfo\\Translation", (void **) &iTrans, &iTransCnt ) ) break; if( iTransCnt == 0 ) break; char *str; UINT len; CString sRes = ssprintf( "\\StringFileInfo\\%04x%04x\\FileVersion", iTrans[0], iTrans[1] ); if( !VerQueryValue( (void *) VersionBuffer.c_str(), (char *) sRes.c_str(), (void **) &str, &len ) || len < 1) break; out = CString( str, len-1 ); } while(0); /* Get the size and date. */ struct stat st; if( stat( fn, &st ) != -1 ) { struct tm t; gmtime_r( &st.st_mtime, &t ); if( !out.empty() ) out += " "; out += ssprintf( "[%ib, %02i-%02i-%04i]", st.st_size, t.tm_mon+1, t.tm_mday, t.tm_year+1900 ); } return true; }