68 votes

Comment obtenir par programme la version d'un fichier DLL ou EXE?

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

99voto

crashmstr Points 15302

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;
}
 

19voto

JSBձոգչ Points 25069

[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
        );

}
 

19voto

Dave Chandler Points 104

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

10voto

Matt Schmidt Points 494

8voto

Vasya Points 79
( pFileInfo->dwFileVersionMS >> 16 ) & 0xff,
( pFileInfo->dwFileVersionMS >> 0 ) & 0xff,
( pFileInfo->dwFileVersionLS >>  16 ) & 0xff,
( pFileInfo->dwFileVersionLS >>  0 ) & 0xff);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X