⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 updatepage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		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 + -