标签:
通过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; }
标签:
原文地址:http://blog.csdn.net/jiangqin115/article/details/45420593