从应用程序中获取应用程序版本

Kon*_*rad 12 c++ windows versioning winapi

有没有一种简单的方法可以在运行时从资源文件中获取应用程序版本信息?

实际上,我想要做的是能够在运行时显示"Version XYZ",而不必在某个地方使用我必须与ProductVersion和FileVersion保持同步的单独变量.

澄清一下:是的,这是一个标准的C++ Windows项目.我知道GetFileVersionInfo方法但是从内存中的版本打开二进制文件只是为了查询版本信息似乎很愚蠢 - 我确定我错过了一些明显的东西:-)

Sup*_*man 7

如果操作系统是Windows,请使用GetFileVersionInfoVerQueryValue功能.


dav*_*_uk 5

我不相信有一种更简单的方法(比打开文件并使用GetFileVersionInfo和VerQueryValue).我使用以下代码,以防它有用:

static CString GetProductVersion()
{
    CString strResult;

    char szModPath[ MAX_PATH ];
    szModPath[ 0 ] = '\0';
    GetModuleFileName( NULL, szModPath, sizeof(szModPath) );
    DWORD dwHandle;
    DWORD dwSize = GetFileVersionInfoSize( szModPath, &dwHandle );

    if( dwSize > 0 )
    {
        BYTE* pbBuf = static_cast<BYTE*>( alloca( dwSize ) );
        if( GetFileVersionInfo( szModPath, dwHandle, dwSize, pbBuf ) )
        {
            UINT uiSize;
            BYTE* lpb;
            if( VerQueryValue( pbBuf,
                               "\\VarFileInfo\\Translation",
                               (void**)&lpb,
                               &uiSize ) )
            {
                WORD* lpw = (WORD*)lpb;
                CString strQuery;
                strQuery.Format( "\\StringFileInfo\\%04x%04x\\ProductVersion", lpw[ 0 ], lpw[ 1 ] );
                if( VerQueryValue( pbBuf,
                                   const_cast<LPSTR>( (LPCSTR)strQuery ),
                                   (void**)&lpb,
                                   &uiSize ) && uiSize > 0 )
                {
                    strResult = (LPCSTR)lpb;
                }
            }
        }
    }

    return strResult;
}
Run Code Online (Sandbox Code Playgroud)

大卫