// UpdateCheck.cpp
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "UpdateCheck.h"
#include "resource.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CUpdateCheck::CUpdateCheck()
{
}
CUpdateCheck::~CUpdateCheck()
{
}
BOOL CUpdateCheck::GetFileVersion(DWORD &dwMS, DWORD &dwLS)
{
char szModuleFileName[MAX_PATH];
LPBYTE lpVersionData;
if (GetModuleFileName(AfxGetInstanceHandle(), szModuleFileName, sizeof(szModuleFileName)) == 0) return FALSE;
DWORD dwHandle;
DWORD dwDataSize = ::GetFileVersionInfoSize(szModuleFileName, &dwHandle);
if ( dwDataSize == 0 )
return FALSE;
lpVersionData = new BYTE[dwDataSize];
if (!::GetFileVersionInfo(szModuleFileName, dwHandle, dwDataSize, (void**)lpVersionData) )
{
delete [] lpVersionData;
return FALSE;
}
ASSERT(lpVersionData != NULL);
UINT nQuerySize;
VS_FIXEDFILEINFO* pVsffi;
if ( ::VerQueryValue((void **)lpVersionData, _T("\\"),
(void**)&pVsffi, &nQuerySize) )
{
dwMS = pVsffi->dwFileVersionMS;
dwLS = pVsffi->dwFileVersionLS;
delete [] lpVersionData;
return TRUE;
}
delete [] lpVersionData;
return FALSE;
}
void CUpdateCheck::Check(UINT uiURL)
{
CString strURL(MAKEINTRESOURCE(uiURL));
Check(strURL);
}
void CUpdateCheck::Check(const CString& strURL)
{
DWORD dwMS, dwLS;
if (!GetFileVersion(dwMS, dwLS))
{
ASSERT(FALSE);
return;
}
CWaitCursor wait;
HINTERNET hInet = InternetOpen(UPDATECHECK_BROWSER_STRING, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL);
HINTERNET hUrl = InternetOpenUrl(hInet, strURL, NULL, -1L,
INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE |
INTERNET_FLAG_NO_CACHE_WRITE |WININET_API_FLAG_ASYNC, NULL);
if (hUrl)
{
char szBuffer[512];
DWORD dwRead;
if (InternetReadFile(hUrl, szBuffer, sizeof(szBuffer), &dwRead))
{
if (dwRead > 0)
{
szBuffer[dwRead] = 0;
CString strSubMS1;
CString strSubMS2;
CString strSub;
DWORD dwMSWeb;
AfxExtractSubString(strSubMS1, szBuffer, 0, '|');
AfxExtractSubString(strSubMS2, szBuffer, 1, '|');
dwMSWeb = MAKELONG((WORD) atol(strSubMS2), (WORD) atol(strSubMS1));
if (dwMSWeb > dwMS)
{
AfxExtractSubString(strSub, szBuffer, 2, '|');
MsgUpdateAvailable(dwMS, dwLS, dwMSWeb, 0, strSub);
}
else
MsgUpdateNotAvailable(dwMS, dwLS);
}
else
MsgUpdateNoCheck(dwMS, dwLS);
}
InternetCloseHandle(hUrl);
}
else
MsgUpdateNoCheck(dwMS, dwLS);
InternetCloseHandle(hInet);
}
HINSTANCE CUpdateCheck::GotoURL(LPCTSTR url, int showcmd)
{
TCHAR key[MAX_PATH + MAX_PATH];
// First try ShellExecute()
HINSTANCE result = ShellExecute(NULL, _T("open"), url, NULL,NULL, showcmd);
// If it failed, get the .htm regkey and lookup the program
if ((UINT)result <= HINSTANCE_ERROR)
{
if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS)
{
lstrcat(key, _T("\\shell\\open\\command"));
if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS)
{
TCHAR *pos;
pos = _tcsstr(key, _T("\"%1\""));
if (pos == NULL) { // No quotes found
pos = _tcsstr(key, _T("%1")); // Check for %1, without quotes
if (pos == NULL) // No parameter at all...
pos = key+lstrlen(key)-1;
else
*pos = '\0'; // Remove the parameter
}
else
*pos = '\0'; // Remove the parameter
lstrcat(pos, _T(" "));
lstrcat(pos, url);
result = (HINSTANCE) WinExec(key,showcmd);
}
}
}
return result;
}
LONG CUpdateCheck::GetRegKey(HKEY key, LPCTSTR subkey, LPTSTR retdata)
{
HKEY hkey;
LONG retval = RegOpenKeyEx(key, subkey, 0, KEY_QUERY_VALUE, &hkey);
if (retval == ERROR_SUCCESS)
{
long datasize = MAX_PATH;
TCHAR data[MAX_PATH];
RegQueryValue(hkey, NULL, data, &datasize);
lstrcpy(retdata,data);
RegCloseKey(hkey);
}
return retval;
}
void CUpdateCheck::MsgUpdateAvailable(DWORD dwMSlocal, DWORD dwLSlocal, DWORD dwMSWeb, DWORD dwLSWeb, const CString& strURL)
{
CString strMessage;
strMessage.Format(IDS_UPDATE_AVAILABLE, HIWORD(dwMSlocal), LOWORD(dwMSlocal), HIWORD(dwMSWeb), LOWORD(dwMSWeb));
if (AfxMessageBox(strMessage, MB_YESNO|MB_ICONINFORMATION) == IDYES)
GotoURL(strURL, SW_SHOW);
}
void CUpdateCheck::MsgUpdateNotAvailable(DWORD dwMSlocal, DWORD dwLSlocal)
{
AfxMessageBox(IDS_UPDATE_NO, MB_OK|MB_ICONINFORMATION);
}
void CUpdateCheck::MsgUpdateNoCheck(DWORD dwMSlocal, DWORD dwLSlocal)
{
AfxMessageBox(IDS_UPDATE_NOCHECK, MB_OK|MB_ICONINFORMATION);
}
没有合适的资源?快使用搜索试试~ 我知道了~
自动升级软件Update1.0
共2个文件
cpp:1个
h:1个
需积分: 9 25 下载量 144 浏览量
2009-09-03
10:57:01
上传
评论
收藏 2KB ZIP 举报
温馨提示
自动升级软件Update1.0自动升级软件Update1.0自动升级软件Update1.0自动升级软件Update1.0
资源推荐
资源详情
资源评论
收起资源包目录
updatecheck_src.zip (2个子文件)
UpdateCheck.cpp 5KB
UpdateCheck.h 1KB
共 2 条
- 1
资源评论
efief
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功