通过API:GetFileVersionInfoSize, GetFileVersionInfo,VerQueryValue获取版本信息
首先,在MFC生成的应用程序框架中,版本信息中有FILEVERSION 和 PRODUCTVERSION 两项
PRODUCTVERSION代表该产品的版本,FILEVERSION代表该文件的版本
区别:文件版本一般每改一次加一, 产品版本则是一般每发布一次加一,较大改动时则前面的版本号加1.
具体代码如下:
#include <winver.h>
#pragma comment(lib, "Version.lib")
//获取指定文件的版本信息(例如1.0.1.5)
string GetProductVersion(const char* lpszFileName)
{
TCHAR szFileName[MAX_PATH] = {0}; // 要获取信息的文件
if (lpszFileName == NULL)
{
::GetModuleFileName(NULL, szFileName, sizeof(szFileName));
}
else
{
lstrcpy(szFileName, lpszFileName);
}
//得到容纳文件版本信息需要缓冲区的大小,如文件不包含版本信息,则返回0.
string sVerInfo;
DWORD dwVerHnd = 0;
DWORD dwVerInfoSize = ::GetFileVersionInfoSize(szFileName, &dwVerHnd);
if (0 != dwVerInfoSize)
{
HANDLE hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
LPVOID lpMem = ::GlobalLock(hMem);
if (NULL == lpMem)
{
return "";
}
//获取文件版本信息,保存到lpvMem中,非0表示成功,0表示失败
if (::GetFileVersionInfo(szFileName, dwVerHnd, dwVerInfoSize, lpMem))
{
//从版本资源中获取查询的信息复制到一个缓冲区pFileInfo里
//非零表示成功,如请求的信息不存在,或pBlock不属于有效版本信息,那就返回一个零
const char* lpSubBlock = TEXT("\\"); //"\"标示获取文件的VS_FIXEDFILEINFO结构
VS_FIXEDFILEINFO *pFileInfo = NULL; //用于装载请求到的版本信息
unsigned int uInfoSize = 0; //请求到的版本信息的长度
if (::VerQueryValue(lpMem, lpSubBlock, (void**)&pFileInfo, &uInfoSize))
{
//获取"产品版本"(区分与文件版本)
WORD nVer[4] = { 0 };
nVer[0] = HIWORD(pFileInfo->dwProductVersionMS);
nVer[1] = LOWORD(pFileInfo->dwProductVersionMS);
nVer[2] = HIWORD(pFileInfo->dwProductVersionLS);
nVer[3] = LOWORD(pFileInfo->dwProductVersionLS);
char szVerInfo[256] = { 0 };
sprintf_s(szVerInfo, _T("%d.%d.%d.%d"), nVer[0], nVer[1], nVer[2], nVer[3]);
sVerInfo = szVerInfo;
}
}
::GlobalUnlock(hMem);
::GlobalFree(hMem);
}
return sVerInfo;
}