📄 updatepage.cpp
字号:
wsprintf(FilePath,"%s\\%s\\%s",m_sExePath.GetBuffer(0),pStuUPDATE[i].FilePath,
pStuUPDATE[i].FileName);//最后文件
wsprintf(FilePathTemp,"%s.tmp",FilePath);//保存临时文件
m_OneLen = pStuUPDATE[i].FileLength;
if(DownHttpFile(pStuUPDATE[i].FileUrl,FilePathTemp,i,pStuUPDATE[i].FileName) != 0)
{
LVITEM lvItem;
lvItem.mask = LVIF_IMAGE | LVIF_STATE;
lvItem.state = LVIS_SELECTED | LVIS_FOCUSED;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.iImage = 14;
m_UpList.SetItem(&lvItem);
m_UpList.SetItemText(i,2, MiniCT_1719);
wsprintf(FilePath,"%s %s",pStuUPDATE[i].FileName, MiniCT_1719);
AddEvent(M_ERROR,FilePath);
m_UpLen+= pStuUPDATE[i].FileLength;
m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
// m_Prog2.Invalidate();
continue;
}
else
{
char temp[255] = {0};
unsigned char md_value[MAX_MD_SIZE]="";
unsigned int md_len;
char outMsg[255] = {0};
wsprintf(temp,"%s%s...",MiniCT_1721, pStuUPDATE[i].FileName); //校验
AddEvent(M_WARING,temp);
if(CEvp::Digest("md5",FilePathTemp,0,md_value,&md_len, outMsg))//本地存在文件
{
if(pStuUPDATE[i].FileGuid != LmToHText(md_value,md_len))//文件相同,不加入队列
{
LVITEM lvItem;
lvItem.mask = LVIF_IMAGE | LVIF_STATE;
lvItem.state = LVIS_SELECTED | LVIS_FOCUSED;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.iImage = 14;
m_UpList.SetItem(&lvItem);
m_UpList.SetItemText(i,2, MiniCT_1722); //校验失败
wsprintf(temp,"%s%s", pStuUPDATE[i].FileName, MiniCT_1722); //校验失败!
AddEvent(M_ERROR,temp);
m_UpLen+= pStuUPDATE[i].FileLength;
m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
//删除本地文件
DeleteFile(FilePathTemp);
continue;
}
}
//修改文件名
if(MoveFileEx(FilePathTemp,FilePath,MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING))
{
LVITEM lvItem;
lvItem.mask = LVIF_IMAGE | LVIF_STATE;
lvItem.state = LVIS_SELECTED | LVIS_FOCUSED;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.iImage = 13;
m_UpList.SetItem(&lvItem);
m_UpList.SetItemText(i, 2, MiniCT_1723); //升级成功
FileOperate(FilePath, pStuUPDATE[i].FileOperate);//文件操作
wsprintf(temp,"%s%s", pStuUPDATE[i].FileName, MiniCT_1723);//升级成功
AddEvent(M_OK,temp);
}
else
{
if(MoveFileEx(FilePathTemp,FilePath,MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_REPLACE_EXISTING))
{
LVITEM lvItem;
lvItem.mask = LVIF_IMAGE | LVIF_STATE;
lvItem.state = LVIS_SELECTED | LVIS_FOCUSED;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.iImage = 15;
m_UpList.SetItem(&lvItem);
m_UpList.SetItemText(i, 2, MiniCT_1724); //需要重启
wsprintf(temp,"%s%s",pStuUPDATE[i].FileName, MiniCT_1725); //将在重启后更新
AddEvent(M_WARING,temp);
bNeedReset = TRUE;
}
else
{
GetLastError();
m_UpLen+= pStuUPDATE[i].FileLength;
m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
// m_Prog2.Invalidate();
continue;
}
}
}
}
delete [] pStuUPDATE;
m_bUpdate = FALSE;
if(m_bReset && bNeedReset)//允许重新启动
{
//MiniCT_1726 MiniCT_1727
if(MessageBox(MiniCT_1726, MiniCT_1727, MB_ICONQUESTION | MB_DEFBUTTON2| MB_YESNO) == IDYES)
{
SystemShutdown(EWX_REBOOT | EWX_FORCE, 0);
}
else
AddEvent(M_WARING, MiniCT_1728);//系统需要重启以应用更新
}
else if(!m_bReset && bNeedReset)
{
AddEvent(M_WARING, MiniCT_1728);
}
}
void CUpdatePage::GetLastError()
{
LPVOID lpMsgBuf;
DWORD dErrCode = ::GetLastError();
if(FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,NULL, dErrCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf, 0,NULL ))
{
AddEvent(M_ERROR,(LPTSTR)lpMsgBuf);
}
else
{
char buf[256] = {0};
GetErrInfo(dErrCode, buf);
//wsprintf(buf,"错误代码%d",dErrCode);
AddEvent(M_ERROR,buf); //ERROR_INTERNET_TIMEOUT
}
LocalFree( lpMsgBuf );
}
void CUpdatePage::AddEvent(int iState ,CString Info)
{
AddMsg(Info,iState);
}
CWinThread * ThreadUpdate = NULL; //枚举线程
UINT _CheckDonwloadThread(LPVOID lparam)
{
CUpdatePage * p=(CUpdatePage*)lparam;
p->CheckDonwloadThread();
//变换图标
((CMiniMainDlg *)p->m_pParent)->SetItemIcon(MiniCT_0006, 12);
return 1;
}
void CUpdatePage::OnBup()
{
// TODO: Add your control notification handler code here
if(m_bUpdate)
return ;
m_sExePath += "\\";
if(!CMiniCaApp::MakeSureDirectoryPathExists(m_sExePath))
{
CString str;
str.Format("建立目录%s失败!",m_sExePath);
AddEvent(M_ERROR,str.GetBuffer(0));
return ;
}
/* if(_mkdir(m_sExePath) == -1)
{
if(errno==ENOENT)//目录没有发现
{
CString str;
str.Format("建立目录%s失败!",m_sExePath);
AddEvent(M_ERROR,str.GetBuffer(0));
return ;
}
}*/
m_TaskLen = m_UpLen = m_OneLen = 0;
UINT dwthreadId = 0;
//变换图标
((CMiniMainDlg *)GetParent())->SetItemIcon(MiniCT_0006, 16);
ThreadUpdate = ::AfxBeginThread(_CheckDonwloadThread,this,THREAD_PRIORITY_IDLE);
}
BOOL CUpdatePage::SystemShutdown(UINT uFlags, DWORD dwReason)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (::GetLastError() != ERROR_SUCCESS)
return FALSE;
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(uFlags, dwReason))
return FALSE;
return TRUE;
}
BOOL CUpdatePage::RegSvr(char *DllPath, BOOL bType)
{
// Initialize OLE.
if (FAILED(OleInitialize(NULL)))//没有此句,将导致注册失败
{
return FALSE;
}
HRESULT (STDAPICALLTYPE * lpDllEntryPoint)(void);
// Load the library.
HINSTANCE hLib = LoadLibraryEx(DllPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
TCHAR szError[12];
wsprintf(szError, _T("0x%08lx"), ::GetLastError());
//DisplayMessage(IDS_LOADLIBFAILED, pszDllName, szError);
//iReturn = FAIL_LOAD;
goto CleanupOle;
}
// Find the entry point.
if(bType)
{
(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib,_T("DllRegisterServer"));
}
else
(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib,_T("DllUnregisterServer"));
if (lpDllEntryPoint == NULL)
{
TCHAR szExt[_MAX_EXT];
_tsplitpath(DllPath, NULL, NULL, NULL, szExt);
/* if ((_stricmp(szExt, ".dll") != 0) && (_stricmp(szExt, ".ocx") != 0))
DisplayMessage(IDS_NOTDLLOROCX, pszDllName, pszDllEntryPoint);
else
DisplayMessage(IDS_NOENTRYPOINT, pszDllName, pszDllEntryPoint);
iReturn = FAIL_ENTRY;*/
goto CleanupLibrary;
}
// Call the entry point.
if (FAILED((*lpDllEntryPoint)()))
{
// DisplayMessage(IDS_CALLFAILED, pszDllEntryPoint, pszDllName);
// iReturn = FAIL_REG;
goto CleanupLibrary;
}
CleanupLibrary:
FreeLibrary(hLib);
CleanupOle:
OleUninitialize();
return TRUE;
}
BOOL CUpdatePage::FileOperate(char *FilePath, char *Operate)
{
if(_strnicmp(Operate,"Reg",4) == 0)//注册
{
RegSvr(FilePath);
}
else if(_strnicmp(Operate,"Run",4) == 0)//运行
{
/* PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb = sizeof(si);
si.dwX = CreateWindow();
si.dwY = CreateWindow();;
si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW;
bool fRet=CreateProcess(FilePath,NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
*/ }
else if(_strnicmp(Operate,"Open",4) == 0)//打开
{
ShellExecute(this->m_hWnd,"open",FilePath,"","",SW_SHOW );
}
return TRUE;
}
CString CUpdatePage::LmToHText(UCHAR * pValue, UINT uLen) //乱码转16进制
{
char * pBuf = new char[2*uLen+1];
memset(pBuf,0,2*uLen+1);
for(unsigned i=0;i<uLen;i++)
{
sprintf(pBuf+i*2,"%02X",pValue[i]);//02x标示1个16进制变为2个字符,空补零
}
CString str;
str.Format("%s",pBuf);
delete pBuf;
return str;
}
CString CUpdatePage::GetFileGuid(CString strFile)
{
unsigned char md_value[MAX_MD_SIZE]="";
unsigned int md_len;
char outMsg[255] = {0};
CEvp::Digest("md5",strFile.GetBuffer(0),0,md_value,&md_len, outMsg);//本地存在文件
return LmToHText(md_value,md_len);
}
void CUpdatePage::OnRclickListctrl(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
/* CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"所有文件(*.*)|*.*||",NULL);
if(dlgOpen.DoModal()!=IDOK) return;
CString strGuid = GetFileGuid(dlgOpen.GetPathName());
if(OpenClipboard())
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, strGuid.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(strGuid.GetBuffer(0)));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}*/
*pResult = 0;
}
void CUpdatePage::AddMsg(CString info, DWORD type)
{
CMiniMainDlg * pMain = (CMiniMainDlg *)m_pParent;
pMain->AddMsg(MiniCT_0006, info, type);
}
BOOL CUpdatePage::PreTranslateMessage(MSG* pMsg)
{
// CG: The following block was added by the ToolTips component. { // Let the ToolTip process this message. m_tooltip.RelayEvent(pMsg); } return CPropertyPage::PreTranslateMessage(pMsg); // CG: This was added by the ToolTips component.
}
void CUpdatePage::GetErrInfo(DWORD dError, char * tmp_msg)
{
switch (dError)
{
case 12001:
tmp_msg = ("Out of handles");
break;
case 12002:
tmp_msg = ("Timeout");
// error_code = FETCH_TIMEOUT;
break;
case 12004:
tmp_msg = ("Internal Error");
break;
case 12005:
tmp_msg = ("Invalid URL");
// error_code = FETCH_BAD_URL;
break;
case 12007:
tmp_msg = ("Service Name Not Resolved");
// error_code = FETCH_CANNOT_RESOLVE;
break;
case 12008:
tmp_msg = ("Protocol Not Found");
// error_code = FETCH_BAD_URL;
break;
case 12013:
tmp_msg = ("Incorrect User Name");
// error_code = FETCH_BAD_USERNAME;
break;
case 12014:
tmp_msg = ("Incorrect Password");
// error_code = FETCH_BAD_PASSWORD;
break;
case 12015:
tmp_msg = ("Login Failure");
// error_code = FETCH_LOGIN_FAILED;
break;
case 12016:
tmp_msg = ("Invalid Operation");
break;
case 12017:
tmp_msg = ("Operation Canceled");
break;
case 12020:
tmp_msg = ("Not Proxy Request");
break;
case 12023:
tmp_msg = ("No Direct Access");
break;
case 12026:
tmp_msg = ("Request Pending");
break;
case 12027:
tmp_msg = ("Incorrect Format");
break;
case 12028:
tmp_msg = ("Item not found");
break;
case 12029:
tmp_msg = ("Cannot connect");
// error_code = FETCH_CANNOT_CONNECT;
break;
case 12030:
tmp_msg = ("Connection Aborted");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -