猿问

如何以编程方式获取DLL或EXE文件的版本?

我需要使用C或C ++中的Win32本机API获取DLL或EXE文件的产品版本和文件版本。我不是在寻找Windows版本,而是在DLL文件上单击鼠标右键,选择“属性”,然后查看“详细信息”选项卡所看到的版本号。这通常是一个四部分的虚线版本号xxxx



HUH函数
浏览 662回答 3
3回答

翻阅古今

您将使用GetFileVersionInfo API。请参阅MSDN站点上的使用版本信息。样品: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;}

呼啦一阵风

所有这些解决方案均无法正常运行(在我的系统上)。我发现版本号的四个部分中的每个部分都保存为16位值。前两个数字保存在32位DWORD dwFileVersionMS中,后两个数字保存在dwFileVersionLS中。因此,我在输出部分编辑了您的代码,如下所示:    TRACE( "File Version: %d.%d.%d.%d\n",        ( pFileInfo->dwFileVersionMS >> 16 ) & 0xffff,        ( pFileInfo->dwFileVersionMS >>  0 ) & 0xffff,        ( pFileInfo->dwFileVersionLS >> 16 ) & 0xffff,        ( pFileInfo->dwFileVersionLS >>  0 ) & 0xffff        );而且效果很好。输出的格式类似于我的系统:主要,次要,修订版本

牛魔王的故事

您可以使用版本信息API获得此信息。这是一个示例:void PrintFileVersion( TCHAR *pszFilePath ){    DWORD               dwSize              = 0;    BYTE                *pbVersionInfo      = NULL;    VS_FIXEDFILEINFO    *pFileInfo          = NULL;    UINT                puLenFileInfo       = 0;    // Get the version information 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        );}
随时随地看视频慕课网APP
我要回答