VC++ MFC编程版本信息控制
一、工程中添加版本信息
绿色框内为文件本件(FileVersion),红色框为产品版本(ProductVersion),两者的区别是一个文件可能包含多个产品,所以一般我们是获取软件的产品版本(ProductVersion)实现版本的控制。
需要注意的是不管是FileVersion还是ProductVersion,在两个框内的信息必须一致,不然可能会出现意想不到的问题。
二、数据库中添加版本信息
数据库建表的操作我这边就不做详细介绍了,这里使用的是Sqlserver2005数据库,表名为ToolVersionList,表的数据类型为Varchar,版本格式如图1.0.4,与第一步中的ProductVersion一致。
三、编写代码
这里没有连接数据库的相关内容操作,如果还不知道怎样连接数据库的同学可以参考我介绍连接数据库的文章,这里就不做详细介绍了。
BOOL CheckToolVersion()
{
CString csVer;
CString strVersion ;
CString sql;
_variant_t var;
TCHARszFullPath[MAX_PATH];
DWORDdwVerInfoSize = 0;
DWORDdwVerHnd;
VS_FIXEDFILEINFO* pFileInfo;
//从数据库中获取最新软件版本
try
{
sql.Format("select* from ToolVersionList where Enable = 1");
if(m_pRst->State)
m_pRst->Close();
m_pRst=m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
if(!m_pRst->adoEOF)
{
var= m_pRst->GetCollect("MaintenanceTool");
csVer= (LPCTSTR)(_bstr_t)var;
}
if(m_pRst->State)
m_pRst->Close();
}
catch(_com_errore)
{
returnFALSE;
}
//获取当前软件版本
GetModuleFileName(NULL,szFullPath, sizeof(szFullPath));
dwVerInfoSize= GetFileVersionInfoSize(szFullPath, &dwVerHnd);
if (dwVerInfoSize)
{
HANDLE hMem;
LPVOID lpvMem;
unsignedint uInfoSize = 0;
hMem= GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
lpvMem= GlobalLock(hMem);
GetFileVersionInfo(szFullPath,dwVerHnd, dwVerInfoSize, lpvMem);
::VerQueryValue(lpvMem,(LPTSTR)_T("\\"), (void**)&pFileInfo, &uInfoSize);
WORDm_nProdVersion[3];
m_nProdVersion[0]= LOWORD(pFileInfo->dwProductVersionMS);
m_nProdVersion[1]= HIWORD(pFileInfo->dwProductVersionLS);
m_nProdVersion[2]= LOWORD(pFileInfo->dwProductVersionLS);
strVersion.Format(_T("%d.%d.%d"),m_nProdVersion[0],m_nProdVersion[1],m_nProdVersion[2]);
GlobalUnlock(hMem);
GlobalFree(hMem);
}
//版本对比
if(strVersion != csVer.Right(5))
{
AfxMessageBox("该软件版本不是最新,请使用最新版本"+csVer+"!");
returnFALSE;
}
returnTRUE;
}
这个函数可以放在工程初始化连接好数据库之后调用,实现对版本的控制,每次更新可以把版本加1,这样可以确保在实际项目中使用的是最新的软件,谢谢。
此文章只是个人在实际项目中所总结的一点小小经验,代码不是非常的严谨,觉得有帮助的可以参考一下,觉得有问题的可以给我留言,便于我做出改善,大家相互学习。