为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

您将使用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;

}


查看完整回答
反对 回复 2019-12-27
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

所有这些解决方案均无法正常运行(在我的系统上)。我发现版本号的四个部分中的每个部分都保存为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

        );

而且效果很好。输出的格式类似于我的系统:


主要,次要,修订版本


查看完整回答
反对 回复 2019-12-27
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

您可以使用版本信息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

        );

}


查看完整回答
反对 回复 2019-12-27
  • 3 回答
  • 0 关注
  • 654 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信