前言
之前写过一篇博文,《VS2010获取程序自身的版本号》
近期开发的一个应用,发现在Win7下正常,但到了Win10下,无法获得正确的版本号。
跟踪后发现问题出在这里:
GetFileVersionInfoSize
这个接口在Win7下正确返回,但在Win10下返回错误。
获取资源中版本号的新方法
不想深究Win7和Win10系统处理这个API有什么区别了,于是换了一种方式来获取版本号:
void CEMHDetectDlg::GetVersion(CString &ver)
{
HRSRC hsrc = FindResource(0, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
HGLOBAL hgbl = LoadResource(0, hsrc);
BYTE *pBt = (BYTE *)LockResource(hgbl);
VS_FIXEDFILEINFO* pFinfo = (VS_FIXEDFILEINFO*)(pBt + 40);
ver.Format(_T("V%d.%d.%d.%d"),
(pFinfo->dwFileVersionMS >> 16) & 0xFF,
(pFinfo->dwFileVersionMS) & 0xFF,
(pFinfo->dwFileVersionLS >> 16) & 0xFF,
(pFinfo->dwFileVersionLS) & 0xFF);
}
头文件及错误处理
如果编译提示缺符号,添加两个头文件即可:
#include "Windows.h"
#include "winres.h"
如果提示VS_FIXEDFILEINFO找不到定义,可以包含头文件,也可以自己加个定义即可:
typedef struct tagVS_FIXEDFILEINFO {
DWORD dwSignature;
DWORD dwStrucVersion;
DWORD dwFileVersionMS;
DWORD dwFileVersionLS;
DWORD dwProductVersionMS;
DWORD dwProductVersionLS;
DWORD dwFileFlagsMask;
DWORD dwFileFlags;
DWORD dwFileOS;
DWORD dwFileType;
DWORD dwFileSubtype;
DWORD dwFileDateMS;
DWORD dwFileDateLS;
} VS_FIXEDFILEINFO;
使用这种方式,是直接加载程序的资源文件中的版本号资源,从中读出版本信息。
兼容性测试
经测试,Win7和Win10下都能正确获取到资源文件中定义的版本号。