c++ - tout - ouvrir un fichier dll windows 8




Comment puis-je obtenir par programme la version d'un fichier DLL ou EXE? (5)

J'ai besoin d'obtenir la version du produit et la version du fichier pour un fichier DLL ou EXE en utilisant les API natives Win32 en C ou C ++. Je ne cherche pas la version de Windows, mais les numéros de version que vous voyez en cliquant-droit sur un fichier DLL, en sélectionnant "Propriétés", puis en regardant l'onglet "Détails". Ceci est généralement un numéro de version en pointillés en quatre parties xxxx


Ce code affiche correctement les numéros de version du fichier.

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

Comme aucune des réponses ne le mentionne ... J'ai découvert que vous devez faire des calculs différents selon que vous utilisez des systèmes 32 ou 64 bits . C'est pourquoi vous trouvez que certaines réponses dans cette question fonctionnent pour vous, et d'autres pas.

Voici un exemple de mise en œuvre que j'utilise:

if(IsWow64())
{
        // 64 bit build
        major =     (verInfo->dwProductVersionMS >> 16) & 0xffff;
        minor =     (verInfo->dwProductVersionMS >>  0) & 0xffff;
        revision =  (verInfo->dwProductVersionLS >> 16) & 0xffff;
        build =     (verInfo->dwProductVersionLS >>  0) & 0xffff;
} 
else
{
        // 32 bit build
        major =     HIWORD(verInfo->dwProductVersionMS);
        minor =     LOWORD(verInfo->dwProductVersionMS);
        revision =  HIWORD(verInfo->dwProductVersionLS);
        build =     LOWORD(verInfo->dwProductVersionLS);
}

Et l'implémentation de IsWow64 (pas la mienne):

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;

BOOL IsWow64()
{
    BOOL bIsWow64 = FALSE;

    //IsWow64Process is not available on all supported versions of Windows.
    //Use GetModuleHandle to get a handle to the DLL that contains the function
    //and GetProcAddress to get a pointer to the function if available.

    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
        GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

    if(NULL != fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
        {
            // Handle error...
        }
    }
    return bIsWow64;
}

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 sont enregistrées en tant que valeur de 16 bits.

Les deux premiers nombres sont enregistrés dans DWORD dwFileVersionMS 32 bits et les deux autres dans dwFileVersionLS. J'ai donc édité votre code dans la section de 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 fonctionne parfaitement. La sortie est formatée comme sur mon système:

major.minor.build.revision



Vous utiliseriez l'API GetFileVersionInfo .

Voir Utilisation des informations de version sur le site MSDN.

Échantillon:

DWORD  verHandle = 0;
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)
                {

                    // Doesn't matter if you are on 32 bit or 64 bit,
                    // DWORD is always 32 bits, so first two revision numbers
                    // come from dwFileVersionMS, last two come from dwFileVersionLS
                    TRACE( "File Version: %d.%d.%d.%d\n",
                    ( verInfo->dwFileVersionMS >> 16 ) & 0xffff,
                    ( verInfo->dwFileVersionMS >>  0 ) & 0xffff,
                    ( verInfo->dwFileVersionLS >> 16 ) & 0xffff,
                    ( verInfo->dwFileVersionLS >>  0 ) & 0xffff
                    );
                }
            }
        }
    }
    delete[] verData;
}




exe