Пример #1
0
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;
}
Пример #2
0
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;
}