Je dois obtenir la version du produit et la version du fichier pour un fichier DLL ou EXE à l'aide des API natives Win32 en C ou C ++. Je ne cherche pas la version Windows, mais les numéros de version que vous voyez en cliquant avec le bouton droit de la souris sur un fichier DLL, en sélectionnant "Propriétés", puis en consultant l'onglet "Détails". Il s’agit généralement d’un numéro de version en pointillé à quatre parties xxxx
Réponses
Trop de publicités?Vous utiliseriez l'API GetFileVersionInfo .
Voir Utilisation des informations de version sur le site MSDN.
Échantillon:
DWORD verHandle = NULL;
UINT size = 0;
LPBYTE lpBuffer = NULL;
DWORD verSize = GetFileVersionInfoSize( szVersionFile, &verHandle);
if (verSize != NULL)
{
LPSTR verData = new char[verSize];
if (GetFileVersionInfo( szVersionFile, verHandle, verSize, verData))
{
if (VerQueryValue(verData,"\\",(VOID FAR* FAR*)&lpBuffer,&size))
{
if (size)
{
VS_FIXEDFILEINFO *verInfo = (VS_FIXEDFILEINFO *)lpBuffer;
if (verInfo->dwSignature == 0xfeef04bd)
{
int major = HIWORD(verInfo->dwFileVersionMS);
int minor = LOWORD(verInfo->dwFileVersionMS);
int build = verInfo->dwFileVersionLS;
}
}
}
}
delete[] verData;
}
[Réponse automatique, car il m'a fallu beaucoup de recherches sur Google pour trouver la bonne réponse à cette question, et pour le moment, les résultats les plus consultés sur Google sont trompeurs.]
Vous obtenez ces informations à l'aide des API d'informations de version ( http://msdn.microsoft.com/en-us/library/ms646981.aspx ). Voici un échantillon:
void PrintFileVersion( TCHAR *pszFilePath )
{
DWORD dwSize = 0;
BYTE *pbVersionInfo = NULL;
VS_FIXEDFILEINFO *pFileInfo = NULL;
UINT puLenFileInfo = 0;
// get the version info for the file requested
dwSize = GetFileVersionInfoSize( pszFilePath, NULL );
if ( dwSize == 0 )
{
printf( "Error in GetFileVersionInfoSize: %d\n", GetLastError() );
return;
}
pbVersionInfo = new BYTE[ dwSize ];
if ( !GetFileVersionInfo( pszFilePath, 0, dwSize, pbVersionInfo ) )
{
printf( "Error in GetFileVersionInfo: %d\n", GetLastError() );
delete[] pbVersionInfo;
return;
}
if ( !VerQueryValue( pbVersionInfo, TEXT("\\"), (LPVOID*) &pFileInfo, &puLenFileInfo ) )
{
printf( "Error in VerQueryValue: %d\n", GetLastError() );
delete[] pbVersionInfo;
return;
}
// pFileInfo->dwFileVersionMS is usually zero. However, you should check
// this if your version numbers seem to be wrong
printf( "File Version: %d.%d.%d.%d\n",
( pFileInfo->dwFileVersionLS >> 24 ) & 0xff,
( pFileInfo->dwFileVersionLS >> 16 ) & 0xff,
( pFileInfo->dwFileVersionLS >> 8 ) & 0xff,
( pFileInfo->dwFileVersionLS >> 0 ) & 0xff
);
// pFileInfo->dwProductVersionMS is usually zero. However, you should check
// this if your version numbers seem to be wrong
printf( "Product Version: %d.%d.%d.%d\n",
( pFileInfo->dwProductVersionLS >> 24 ) & 0xff,
( pFileInfo->dwProductVersionLS >> 16 ) & 0xff,
( pFileInfo->dwProductVersionLS >> 8 ) & 0xff,
( pFileInfo->dwProductVersionLS >> 0 ) & 0xff
);
}
Toutes ces solutions ne fonctionnaient pas correctement (avec mon système). J'ai découvert que chacune des quatre parties du numéro de version est enregistrée en tant que valeur 16 bits. Les deux premiers numéros sont enregistrés dans le fichier dwFileVersionMS de 8 bits DWORD, les deux derniers dans le fichier dwFileVersionLS. J'ai donc édité votre code dans la section sortie comme ceci:
TRACE( "File Version: %d.%d.%d.%d\n",
( pFileInfo->dwFileVersionMS >> 16 ) & 0xffff,
( pFileInfo->dwFileVersionMS >> 0 ) & 0xffff,
( pFileInfo->dwFileVersionLS >> 16 ) & 0xffff,
( pFileInfo->dwFileVersionLS >> 0 ) & 0xffff
);
Et ça marche parfaitement. La sortie est formatée comme sur mon système:
major.minor.build.revision