// 选择列表框中的所有行 BOOL CMyListCtrl::SelectAll() { BOOL bReturn(TRUE); for (int nItem = 0; IsItem(nItem); nItem++) if (! SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED)) { bReturn = FALSE; break; } return bReturn; }
// 验证是否需要更新 BOOL CUpdaterApp::_CheckNeedUpdate() { BOOL bReturn(FALSE); int nCount = m_arrUpdate.GetSize(); if (nCount > 0) { // 启动线程池 SYSTEM_INFO si = {0}; GetSystemInfo(&si); CThreadPool *pThreadPool = new CThreadPool(32); for (int i(0); i < nCount; ++i) { pThreadPool->Run(_CheckFileMD5, m_arrUpdate.GetAt(i)); } pThreadPool->Wait(INFINITE); delete pThreadPool; // 检查是否存在更新 BOOL bExistUpdate(FALSE); for (int j(0); j < nCount; ++j) { if (m_arrUpdate.GetAt(j)->bNeedUpdate) { bExistUpdate = TRUE; break; } } if (bExistUpdate) { // 询问控制窗口 if (IsWindow(m_hWindowCtrl)) { if (0 == SendMessage(m_hWindowCtrl, UM_IFNEEDUPDATE, 0, 0)) { // 返回值0允许更新 bReturn = TRUE; } } } } else { LOG(_T("更新列表为空!")); } return bReturn; }
// 初始化命令行参数 BOOL CUpdaterApp::_InitCmdline(int argc, LPTSTR* args) { BOOL bReturn(FALSE); CCmdLine cmder; if (cmder.SplitLine(__argc, __targv) >= 2) { if (cmder.HasSwitch(_T("-PID")) && cmder.HasSwitch(_T("-H"))) { m_dwProcessId = (DWORD)_ttoi(cmder.GetSafeArgument(_T("-PID"), 0, _T("0"))); m_hWindowCtrl = (HWND)_ttoi(cmder.GetSafeArgument(_T("-H"), 0, _T("0"))); bReturn = TRUE; } else { LOG(_T("命令行参数错误!")); } } else { LOG(_T("未指定命令行参数")); } return bReturn; }
// 加载PNG图片资源 BOOL CUpdaterApp::LoadPngFromRes(CImage& image, LPCTSTR pszResName) { BOOL bReturn(FALSE); HINSTANCE hInst = AfxGetInstanceHandle(); HRSRC hRsrc = ::FindResource(hInst, pszResName, _T("PNG")); if (hRsrc) { DWORD len = SizeofResource(hInst, hRsrc); BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc); if (lpRsrc) { HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, len); BYTE* pmem = (BYTE*)GlobalLock(hMem); memcpy(pmem, lpRsrc, len); IStream* pstm = NULL; if (S_OK == CreateStreamOnHGlobal(hMem, FALSE, &pstm)) { image.Load(pstm); bReturn = TRUE; } } } return bReturn; }
// 初始化更新列表 BOOL CUpdaterApp::_InitFileList() { BOOL bReturn(FALSE); CString strFileList(m_szServer); strFileList += _T("/Filelist.txt"); CInternetSession sess; sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 5000); sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 1000); sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 5000); sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 1000); sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 5000); sess.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); try { CHttpFile* pHttpFile = (CHttpFile*)sess.OpenURL(strFileList, 1, INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_TRANSFER_ASCII, NULL, 0); if (pHttpFile) { DWORD dwErrCode(0); pHttpFile->QueryInfo(HTTP_QUERY_STATUS_CODE, dwErrCode); if (dwErrCode >= 200 && dwErrCode < 300) { CStringA strLineA; while (pHttpFile->ReadString((LPTSTR)strLineA.GetBuffer(512), 511)) { strLineA.ReleaseBuffer(); // MFC-bug CString strLine(strLineA); strLine.TrimLeft(); if (strLine.GetLength() > 0 && strLine[0] != _T('\\')) { continue; } std::vector<CString> vecStrs = Split(strLine, _T("^^^^^^")); if (vecStrs.size() >= 2) { LPUPDATEITEM pUpdateItem = new UPDATEITEM; ZeroMemory(pUpdateItem, sizeof(*pUpdateItem)); lstrcpyn(pUpdateItem->szFileName, vecStrs[0], MAX_PATH); lstrcpyn(pUpdateItem->szServerMD5, vecStrs[1], 33); m_arrUpdate.Add(pUpdateItem); } } pHttpFile->Close(); sess.Close(); bReturn = TRUE; } else { LOG(_T("网站访问错误码:%d"), dwErrCode); } } } catch (...) { LOG(_T("下载列表异常!")); } return bReturn; }