主要内容:
创建MFC线程
获取文件版本信息
源码:
=============================================================================
主要分两步。第一是获取自身的版本信息;第二是获取现在最新的版本信息。
获取自身版本信息,在软件中获取。获取最新的软件版本信息,则要借助于网络了。从网络上获取版本数据。最后,检测到更新后,更不更新就要看用户的选择了。
第一步,获取自身的版本信息。
第一种方法。简单的方式,在程序中定义一个全局的宏或者字符串常量,表示版本号。程序就可以直接使用了。保持这个值与资源文件中的版本资源一致就最好了。
第二种方式。代码获取,也是我们要使用的方式。
首先考虑一个问题,我们的版本检测放到哪?
我们可以放到软件启动时,创建一个新的线程用来检测更新。
在CBegin09PEInfoApp中添加成员函数,用来检测更新。
BOOL CBegin09PEInfoApp::CheckUpdate()
添加线程函数,在线程中运行更新检测。
申明:static UINT ThreadUpdate(LPVOID lParam);
定义:UINT CBegin09PEInfoApp::ThreadUpdate(LPVOID lParam)
注意要是静态类成员函数。
调用。在CBegin09PEInfoDlg对话框DoModal()显示之前。
//调用检测更新
CheckUpdate();
完善代码。
BOOL CBegin09PEInfoApp::CheckUpdate()
{
//创建检测更新线程
AfxBeginThread(ThreadUpdate,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
return TRUE;
}
获取当前版本信息
BOOL CBegin09PEInfoApp::GetFileVerInfo(DWORD &dwMajVer, DWORD &dwMinVer)
{
//下面是获取自己的版本信息
DWORD dwHandle = 0;
DWORD dwInfoSize = 0;
TCHAR tzFilePath[MAX_PATH] = {0};
char *pVerInfoBuff = NULL;
//获取本程序文件路径
GetModuleFileName(NULL,tzFilePath,MAX_PATH);
//分配内存,获取版本数据
dwInfoSize = GetFileVersionInfoSize(tzFilePath,&dwHandle);
pVerInfoBuff = new char[dwInfoSize];
memset(pVerInfoBuff,0,dwInfoSize);
GetFileVersionInfo(tzFilePath,dwHandle,dwInfoSize,pVerInfoBuff);
//查询固定版本数据,
VS_FIXEDFILEINFO *pvsFixedInfo = NULL;
UINT dwSizeFixed = sizeof(VS_FIXEDFILEINFO);
VerQueryValue(pVerInfoBuff,TEXT("\\"),(LPVOID*)&pvsFixedInfo,&dwSizeFixed);
//版本数据
dwMajVer = pvsFixedInfo->dwProductVersionMS;
dwMinVer = pvsFixedInfo->dwProductVersionLS;
//删除缓存
delete []pVerInfoBuff;
pVerInfoBuff = NULL;
return TRUE;
}
线程函数。
UINT CBegin09PEInfoApp::ThreadUpdate(LPVOID lParam)
{
//转换参数
CBegin09PEInfoApp *pApp = (CBegin09PEInfoApp*)lParam;
if (pApp == NULL)
{
return 0;
}
BOOL bRetCode = FALSE;
//定义两个版本信息数据
CString strVerSelf; //当前版本
CString strVerNew; //新版本字符串
CString strMsg; //版本更新对话框
//定义版本值
DWORD dwMajVerSelf = 0;
DWORD dwMonVerSelf = 0;
DWORD dwMajVerNew = 0;
DWORD dwMinVerNew = 0;
//获取自己版本信息
bRetCode = pApp->GetFileVerInfo(dwMajVerSelf,dwMonVerSelf);
if (!bRetCode)
{
MessageBox(NULL,_T("获取本地版本信息失败,无法更新!"),_T("错误!"),MB_OK);
return 0;
}
//格式化当前产品版本数据
strVerSelf.Format(_T("%08X%08X"),dwMajVerSelf,dwMonVerSelf);
//////////////////////////////////////////////////////////////////////////
//获取网络上更新的版本信息
bRetCode = pApp->GetUpdateInfoFromServer(dwMajVerNew,dwMinVerNew,strMsg);
if (!bRetCode)
{
MessageBox(NULL,strMsg,_T("错误!"),MB_OK);
return 0;
}
strVerNew.Format(_T("%08X%08X"),dwMajVerNew,dwMinVerNew);
//////////////////////////////////////////////////////////////////////////
//判断版本是否更新
if (strVerNew > strVerSelf)
{
//格式化获取的版本字符串
strMsg.Format(_T("Begin09PEInfo发现了更新版本!\r\n当前版本:%d.%d.%d.%d\r\n\
最新版本:%d.%d.%d.%d\r\n\r\n是否现在打开更新版网页?"),
HIWORD(dwMajVerSelf),LOWORD(dwMajVerSelf),
HIWORD(dwMonVerSelf),LOWORD(dwMonVerSelf),
HIWORD(dwMajVerNew),LOWORD(dwMajVerNew),
HIWORD(dwMinVerNew),LOWORD(dwMinVerNew)
);
if (IDOK == MessageBox(NULL,strMsg,_T("Begin09PEInfo更新提示"),MB_OKCANCEL))
{
//打开更新网页
ShellExecute(NULL,_T("open"),_T("/Html/heikexuetang/Begin09PEInfo.htm"),NULL,NULL,SW_SHOW);
}
}
else
{
//如果显示没有更新信息
if (pApp->m_bShowNoUpdate)
{
MessageBox(NULL,_T("当前软件已是最新版本,无需更新!"),_T("提示"),MB_OK);
}
}
return 0;
}