Commit 4235f957aec4b755fedfc9f7c50f8c07e4f43c25

Authored by liuye
1 parent e454f69f

feat(all):提交客户端自动升级项目\

新增客户端自动升级项目,用于所有客户端的升级。

Too many changes to show.

To preserve performance only 11 of 28 files are displayed.

client_auto_updata/AutoUpdate.sln 0 → 100644
  1 +
  2 +Microsoft Visual Studio Solution File, Format Version 12.00
  3 +# Visual Studio 2013
  4 +VisualStudioVersion = 12.0.31101.0
  5 +MinimumVisualStudioVersion = 10.0.40219.1
  6 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AutoUpdate", "AutoUpdate\AutoUpdate.vcxproj", "{30A58DE1-4C62-4882-9730-638BF4209018}"
  7 +EndProject
  8 +Global
  9 + GlobalSection(SolutionConfigurationPlatforms) = preSolution
  10 + Debug|Win32 = Debug|Win32
  11 + Release|Win32 = Release|Win32
  12 + EndGlobalSection
  13 + GlobalSection(ProjectConfigurationPlatforms) = postSolution
  14 + {30A58DE1-4C62-4882-9730-638BF4209018}.Debug|Win32.ActiveCfg = Debug|Win32
  15 + {30A58DE1-4C62-4882-9730-638BF4209018}.Debug|Win32.Build.0 = Debug|Win32
  16 + {30A58DE1-4C62-4882-9730-638BF4209018}.Release|Win32.ActiveCfg = Release|Win32
  17 + {30A58DE1-4C62-4882-9730-638BF4209018}.Release|Win32.Build.0 = Release|Win32
  18 + EndGlobalSection
  19 + GlobalSection(SolutionProperties) = preSolution
  20 + HideSolutionNode = FALSE
  21 + EndGlobalSection
  22 +EndGlobal
... ...
client_auto_updata/AutoUpdate/AUDataManage.cpp 0 → 100644
  1 +#include "stdafx.h"
  2 +#include "AUDataManage.h"
  3 +#include "afxinet.h"
  4 +#include "tlhelp32.h"
  5 +#include "tinyxml.h"
  6 +#include ".\zlib\zip.h"
  7 +#include ".\zlib\unzip.h"
  8 +
  9 +
  10 +CAUDataManage* CAUDataManage::m_pInstance = NULL;
  11 +
  12 +void Log(CString sLog)
  13 +{
  14 + CStdioFile fileLog;
  15 + CString sPath;
  16 + TCHAR szPath[MAX_PATH];
  17 + GetModuleFileName(NULL, szPath, MAX_PATH);
  18 + CString sMudolePath = szPath;
  19 + CString sMudoleName = AfxGetAppName();
  20 + sPath = sMudolePath.Left(sMudolePath.GetLength() - sMudoleName.GetLength() - 4);
  21 +
  22 + CFileStatus statusFile;
  23 + statusFile.m_size = 0;
  24 + CString sLogPath = sPath + "AutoUpdateLog.txt";
  25 + CFile::GetStatus(sLogPath, statusFile);
  26 +
  27 + CTime tmCurTime;
  28 + tmCurTime = CTime::GetCurrentTime();
  29 + CString sData = tmCurTime.Format(_T("%y-%m-%d-%H-%M-%S"));
  30 +
  31 + CString sText = sData + " " + sLog;
  32 + if (statusFile.m_size > 1024 * 1024 * 10)
  33 + {
  34 + if (fileLog.Open(sLogPath, CFile::modeCreate | CFile::modeWrite))
  35 + {
  36 + fileLog.WriteString(sText);
  37 + fileLog.WriteString("\n");
  38 + fileLog.Close();
  39 + }
  40 + }
  41 + else
  42 + {
  43 + if (fileLog.Open(sLogPath, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate))
  44 + {
  45 + fileLog.SeekToEnd();
  46 + fileLog.WriteString(sText);
  47 + fileLog.WriteString("\n");
  48 + fileLog.Close();
  49 + }
  50 + }
  51 +}
  52 +
  53 +
  54 +CAUDataManage::CAUDataManage()
  55 +{
  56 + m_sConfigFileName = "Version.xml";
  57 + m_sConfigFilePath = GetModulePath() + m_sConfigFileName;
  58 +
  59 + m_stuConfigData = ReadConfig(m_sConfigFilePath);
  60 +}
  61 +
  62 +
  63 +CAUDataManage::~CAUDataManage()
  64 +{
  65 +}
  66 +
  67 +BOOL CAUDataManage::CheckVersion()
  68 +{
  69 + BOOL bIsLatest = TRUE;
  70 +
  71 + CreateTempFolder();
  72 + Log("检查版本。");
  73 + CInternetSession *pInternetSession = NULL;
  74 + CFtpConnection *pFtpConnection = NULL;
  75 + pInternetSession = new CInternetSession();
  76 + pFtpConnection = pInternetSession->GetFtpConnection(m_stuConfigData.sServerIP, m_stuConfigData.sUserName, m_stuConfigData.sPassWord);
  77 + CString sFilePath;
  78 + pFtpConnection->GetCurrentDirectory(sFilePath);
  79 + //add for test by liuye 2017.7.17
  80 + Log("for test 获取到的路径是: " + sFilePath);
  81 + //
  82 + sFilePath += m_stuConfigData.sUpdateDir + "/" + m_sConfigFileName;
  83 + CString sTempConfigPath = m_stuConfigData.sTempDir + "\\" + m_sConfigFileName;
  84 + if (pFtpConnection)
  85 + {
  86 + Log("连接到服务器。");
  87 + if (pFtpConnection->GetFile(sFilePath, sTempConfigPath))
  88 + {
  89 + Log("下载到配置文件。");
  90 + APPConfig stuTempConfig = ReadConfig(sTempConfigPath);
  91 + if (stuTempConfig.sVersion.Compare(m_stuConfigData.sVersion) == 0)
  92 + {
  93 + bIsLatest = TRUE;
  94 + }
  95 + else
  96 + {
  97 + bIsLatest = FALSE;
  98 + }
  99 + }
  100 +
  101 + if (!bIsLatest)
  102 + {
  103 + CString sAP;
  104 + pFtpConnection->GetCurrentDirectory(sAP);
  105 + CString sPackageName = sAP + m_stuConfigData.sUpdateDir + "/" + m_stuConfigData.sZipName;
  106 +
  107 + CFtpFileFind finderFtp(pFtpConnection);
  108 + if (!finderFtp.FindFile(sPackageName))
  109 + {
  110 + Log(sPackageName + " " + "文件不存在!");
  111 + bIsLatest = TRUE;
  112 + }
  113 + }
  114 +
  115 + if (NULL != pFtpConnection)
  116 + {
  117 + pFtpConnection->Close();
  118 + delete pFtpConnection;
  119 + pFtpConnection = NULL;
  120 + }
  121 + if (NULL != pInternetSession)
  122 + {
  123 + delete pInternetSession;
  124 + pInternetSession = NULL;
  125 + }
  126 + }
  127 + else
  128 + {
  129 + Log("未连接到服务器。");
  130 + }
  131 +
  132 +
  133 + DeleteDirectory(m_stuConfigData.sTempDir);
  134 + return bIsLatest;
  135 +}
  136 +
  137 +void CAUDataManage::Update()
  138 +{
  139 + HWND hMainWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
  140 +
  141 + PostMessage(hMainWnd, WM_UPDATEPROCESS, 0, PROCESS_KILLCLIENT);
  142 + if (KillCilent(m_stuConfigData.sAppName))
  143 + {
  144 + PostMessage(hMainWnd, WM_UPDATEPROCESS, 0, PROCESS_DOWNLOADFILE);
  145 + if (DownloadClientFile())
  146 + {
  147 + PostMessage(hMainWnd, WM_UPDATEPROCESS, 0, PROCESS_DELETEOLDFILE);
  148 + DeleteDirectory(m_stuConfigData.sAppDir);
  149 + PostMessage(hMainWnd, WM_UPDATEPROCESS, 0, PROCESS_UNZIP);
  150 + if (Unzip(m_stuConfigData.sTempDir + "\\" + m_stuConfigData.sZipName, m_stuConfigData.sAppDir))
  151 + {
  152 + m_stuConfigData = ReadConfig(m_sConfigFilePath);
  153 + }
  154 + }
  155 + }
  156 + PostMessage(hMainWnd, WM_UPDATEPROCESS, 0, PROCESS_COMPLETE);
  157 +}
  158 +
  159 +BOOL CAUDataManage::KillCilent(CString sClientName)
  160 +{
  161 + BOOL bResult = FALSE;
  162 + Log("关闭进程。");
  163 + PROCESSENTRY32 stuClient;
  164 + HANDLE hAllProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  165 + if (hAllProcess != INVALID_HANDLE_VALUE)
  166 + {
  167 + stuClient.dwSize = sizeof(stuClient);
  168 + if (Process32First(hAllProcess, &stuClient))
  169 + {
  170 + CString sPrcessName;
  171 + do
  172 + {
  173 + sPrcessName = stuClient.szExeFile;
  174 + if (sClientName.CompareNoCase(sPrcessName) == 0)
  175 + {
  176 +
  177 + HANDLE hProcessHandle;
  178 + hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, true, stuClient.th32ProcessID);
  179 + if (hProcessHandle != NULL)
  180 + {
  181 + Log("找到进程" + sClientName);
  182 + if (TerminateProcess(hProcessHandle, 0))
  183 + {
  184 + Log(sClientName + "进程关闭。");
  185 + bResult = TRUE;
  186 + }
  187 + else
  188 + {
  189 + Log(sClientName + "进程关闭失败。");
  190 + bResult = FALSE;
  191 + }
  192 + CloseHandle(hProcessHandle);
  193 + break;
  194 + }
  195 + }
  196 + } while (Process32Next(hAllProcess, &stuClient));
  197 + }
  198 + CloseHandle(hAllProcess);
  199 + }
  200 + return bResult;
  201 +}
  202 +
  203 +void CAUDataManage::RestartClient()
  204 +{
  205 + ShellExecute(NULL, "open", m_stuConfigData.sAppDir + CString("\\") + m_stuConfigData.sAppName, NULL, m_stuConfigData.sAppDir, SW_SHOW);
  206 +}
  207 +
  208 +BOOL CAUDataManage::DownloadClientFile()
  209 +{
  210 + BOOL bResult = FALSE;
  211 +
  212 + CreateTempFolder();
  213 +
  214 + CInternetSession *pInternetSession = NULL;
  215 + CFtpConnection *pFtpConnection = NULL;
  216 + pInternetSession = new CInternetSession();
  217 + pFtpConnection = pInternetSession->GetFtpConnection(m_stuConfigData.sServerIP, m_stuConfigData.sUserName, m_stuConfigData.sPassWord);
  218 + CString sFileDir;
  219 + pFtpConnection->GetCurrentDirectory(sFileDir);
  220 + CString sSrcPath = sFileDir + m_stuConfigData.sUpdateDir + "/" + m_stuConfigData.sZipName;
  221 + CString sDstPath = m_stuConfigData.sTempDir + "\\" + m_stuConfigData.sZipName;
  222 + if (pFtpConnection)
  223 + {
  224 + Log("连接到服务器。");
  225 + if (pFtpConnection->GetFile(sSrcPath, sDstPath))
  226 + {
  227 + Log(sDstPath + "文件下载成功");
  228 + bResult = TRUE;
  229 + }
  230 + else
  231 + {
  232 + Log(sDstPath + "文件下载失败");
  233 + bResult = FALSE;
  234 + }
  235 +
  236 + sSrcPath = sFileDir + m_stuConfigData.sUpdateDir + "/" + m_sConfigFileName;
  237 + sDstPath = m_stuConfigData.sTempDir + "\\" + m_sConfigFileName;
  238 + if (pFtpConnection->GetFile(sSrcPath, sDstPath))
  239 + {
  240 + Log(sDstPath + "文件下载成功");
  241 + bResult = TRUE;
  242 + }
  243 + else
  244 + {
  245 + Log(sDstPath + "文件下载失败");
  246 + bResult = FALSE;
  247 + }
  248 + }
  249 + else
  250 + {
  251 + Log("未连接到服务器。");
  252 + }
  253 +
  254 + //释放资源
  255 + if (NULL != pFtpConnection)
  256 + {
  257 + pFtpConnection->Close();
  258 +
  259 + delete pFtpConnection;
  260 +
  261 + pFtpConnection = NULL;
  262 + }
  263 +
  264 +
  265 + if (NULL != pInternetSession)
  266 + {
  267 + delete pInternetSession;
  268 +
  269 + pInternetSession = NULL;
  270 + }
  271 +
  272 + return bResult;
  273 +}
  274 +
  275 +void CAUDataManage::CreateTempFolder()
  276 +{
  277 + CString sFolder = GetModulePath() + L"temp";
  278 + if (PathFileExists(sFolder))
  279 + {
  280 + DeleteDirectory(sFolder);
  281 + }
  282 + CreateDirectory(sFolder, NULL);
  283 +}
  284 +
  285 +void CAUDataManage::DeleteDirectory(CString sDirectory)
  286 +{
  287 + Log("正在删除目录" + sDirectory);
  288 + CFileFind cFind;
  289 + CString sFile = sDirectory + L"\\*.*";
  290 +
  291 + BOOL IsFinded = cFind.FindFile(sFile);
  292 + while (IsFinded)
  293 + {
  294 + IsFinded = cFind.FindNextFile();
  295 + CString sTest = cFind.GetFileName();
  296 + if (!cFind.IsDots())
  297 + {
  298 + CString sFilePath;
  299 + if (cFind.GetFileName().Compare(m_stuConfigData.sSelfName) != 0
  300 + && cFind.GetFilePath().Compare(m_stuConfigData.sTempDir) != 0
  301 + && cFind.GetFileName().Compare("AutoUpdateLog.txt") != 0)
  302 + {
  303 + if (cFind.IsDirectory())
  304 + {
  305 + sFilePath = cFind.GetFilePath();
  306 + DeleteDirectory(sFilePath);
  307 + }
  308 + else
  309 + {
  310 + sFilePath = cFind.GetFilePath();
  311 + if (DeleteFile(sFilePath))
  312 + {
  313 + Log(sFilePath + " " + "删除成功。");
  314 + }
  315 + else
  316 + {
  317 + Log(sFilePath + " " + "删除失败。");
  318 + }
  319 + }
  320 + }
  321 + }
  322 + }
  323 + cFind.Close();
  324 +
  325 + RemoveDirectory(sDirectory);
  326 +}
  327 +
  328 +CString CAUDataManage::GetModulePath()
  329 +{
  330 + CString sPath;
  331 +
  332 + TCHAR szPath[MAX_PATH];
  333 + GetModuleFileName(NULL, szPath, MAX_PATH);
  334 + CString sMudolePath = szPath;
  335 + CString sMudoleName = AfxGetAppName();
  336 + sPath = sMudolePath.Left(sMudolePath.GetLength() - sMudoleName.GetLength() - 4);
  337 + return sPath;
  338 +}
  339 +
  340 +APPConfig CAUDataManage::ReadConfig(CString sConfigName)
  341 +{
  342 + Log("开始读取配置文件。");
  343 + APPConfig stuConfig;
  344 +
  345 + TiXmlDocument xmlDoc(sConfigName.GetBuffer());
  346 + if (xmlDoc.LoadFile())
  347 + {
  348 + TiXmlElement *pRootEle = xmlDoc.RootElement();
  349 + TiXmlElement *pPackageNameEle = pRootEle->FirstChildElement();
  350 + stuConfig.sZipName = pPackageNameEle->GetText();
  351 + TiXmlElement *pAppNameEle = pPackageNameEle->NextSiblingElement();
  352 + stuConfig.sAppName = pAppNameEle->GetText();
  353 + TiXmlElement *pVersionEle = pAppNameEle->NextSiblingElement();
  354 + stuConfig.sVersion = pVersionEle->GetText();
  355 + TiXmlElement *pUpdateDir = pVersionEle->NextSiblingElement();
  356 + stuConfig.sUpdateDir = pUpdateDir->GetText();
  357 + TiXmlElement *pServerIP = pUpdateDir->NextSiblingElement();
  358 + stuConfig.sServerIP = pServerIP->GetText();
  359 + TiXmlElement *pUserName = pServerIP->NextSiblingElement();
  360 + stuConfig.sUserName = pUserName->GetText();
  361 + TiXmlElement *pPassWord = pUserName->NextSiblingElement();
  362 + stuConfig.sPassWord = pPassWord->GetText();
  363 +
  364 + stuConfig.sAppDir = GetModulePath();
  365 + stuConfig.sSelfName = AfxGetAppName() + CString(".exe");
  366 + stuConfig.sTempDir = stuConfig.sAppDir + CString("temp");
  367 +
  368 + Log("读取配置文件完成。");
  369 + }
  370 + return stuConfig;
  371 +}
  372 +
  373 +void CAUDataManage::ReplaceClientFile(CString sAppDir)
  374 +{
  375 + DeleteDirectory(m_stuConfigData.sAppDir);
  376 + Log("旧文件已删除。");
  377 + CopyClientFile(m_stuConfigData.sTempDir, m_stuConfigData.sAppDir);
  378 + DeleteDirectory(m_stuConfigData.sTempDir);
  379 + Log("临时文件已删除。");
  380 +}
  381 +
  382 +void CAUDataManage::CopyClientFile(CString sSrcFile, CString sDstFile)
  383 +{
  384 + CreateDirectory(sDstFile, NULL);
  385 + CFileFind cFinder;
  386 + CString sPath;
  387 + sPath = sSrcFile + "\\*.*";
  388 + BOOL bWorking = cFinder.FindFile(sPath);
  389 + while (bWorking)
  390 + {
  391 + Log("找到文件目录,正在复制文件。");
  392 + bWorking = cFinder.FindNextFile();
  393 + CString sTest = cFinder.GetFileName();
  394 + if (!cFinder.IsDots())
  395 + {
  396 + if (cFinder.IsDirectory())
  397 + {
  398 + CopyClientFile(cFinder.GetFilePath(), sDstFile + ("\\") + cFinder.GetFileName());
  399 + }
  400 + else
  401 + {
  402 + CString stSrcFile = cFinder.GetFilePath();
  403 + BOOL bDir = (GetFileAttributes(stSrcFile) & FILE_ATTRIBUTE_DIRECTORY);
  404 + if (!bDir)
  405 + {
  406 + if (CopyFile(cFinder.GetFilePath(), sDstFile + ("\\") + cFinder.GetFileName(), FALSE))
  407 + {
  408 + Log(cFinder.GetFileName() + " " + "文件复制成功。");
  409 + }
  410 + else
  411 + {
  412 + Log(cFinder.GetFileName() + " " + "文件复制失败。");
  413 + }
  414 + }
  415 + }
  416 + }
  417 +
  418 + }
  419 +}
  420 +
  421 +void CAUDataManage::DownloadFile(CString sSrcFile, CString sDstFile, CFtpConnection *pFtpConnection)
  422 +{
  423 + if (pFtpConnection)
  424 + {
  425 + Log("连接服务器成功,开始查找文件。");
  426 + /*BOOL bResult =*/ pFtpConnection->SetCurrentDirectory(sSrcFile);
  427 + CFtpFileFind cFTPFind(pFtpConnection);
  428 +
  429 + CreateDirectory(sDstFile, NULL);
  430 +
  431 + CString sPath;
  432 + sPath =/* sCurPath + */sSrcFile + "/*.*";
  433 + BOOL bWorking = cFTPFind.FindFile(sSrcFile);
  434 + while (bWorking)
  435 + {
  436 + Log("找到文件目录,开始下载文件。");
  437 + bWorking = cFTPFind.FindNextFile();
  438 + if (!cFTPFind.IsDots())
  439 + {
  440 + if (cFTPFind.IsDirectory())
  441 + {
  442 +
  443 + CInternetSession *pInternetSession = NULL;
  444 + CFtpConnection *pFtpConnection = NULL;
  445 + pInternetSession = new CInternetSession();
  446 + pFtpConnection = pInternetSession->GetFtpConnection(m_stuConfigData.sServerIP, m_stuConfigData.sUserName, m_stuConfigData.sPassWord);
  447 + DownloadFile(sSrcFile + "/" + cFTPFind.GetFileName(), sDstFile + ("\\") + cFTPFind.GetFileName(), pFtpConnection);
  448 + if (NULL != pFtpConnection)
  449 + {
  450 + pFtpConnection->Close();
  451 + delete pFtpConnection;
  452 + pFtpConnection = NULL;
  453 + }
  454 + if (NULL != pInternetSession)
  455 + {
  456 + delete pInternetSession;
  457 + pInternetSession = NULL;
  458 + }
  459 + }
  460 + else
  461 + {
  462 + CString sFilePath = cFTPFind.GetFilePath();
  463 + CString sNewFile = sDstFile + "\\" + cFTPFind.GetFileName();
  464 + BOOL bResult = pFtpConnection->GetFile(sFilePath, sNewFile);
  465 + }
  466 + }
  467 +
  468 + }
  469 + }
  470 +
  471 +}
  472 +
  473 +CAUDataManage* CAUDataManage::Instantialize()
  474 +{
  475 + if (m_pInstance == NULL)
  476 + { //double check
  477 + //Lock lock(m_csLocker); //用lock实现线程安全,用资源管理类,实现异常安全
  478 + //使用资源管理类,在抛出异常的时候,资源管理类对象会被析构,析构总是发生的无论是因为异常抛出还是语句块结束。
  479 + if (m_pInstance == NULL)
  480 + {
  481 + m_pInstance = new CAUDataManage();
  482 + }
  483 + }
  484 + return m_pInstance;
  485 +}
  486 +
  487 +void CAUDataManage::DestoryInstance()
  488 +{
  489 + if (m_pInstance)
  490 + {
  491 + delete m_pInstance;
  492 + m_pInstance = NULL;
  493 + }
  494 +}
  495 +
  496 +BOOL CAUDataManage::Unzip(CString sSrcDir, CString sDstDir)
  497 +{
  498 + BOOL bResult = FALSE;
  499 + Log("开始解压文件" + sSrcDir);
  500 + HZIP hZip = OpenZip(sSrcDir.GetBuffer(), NULL);
  501 + if (hZip)
  502 + {
  503 + SetUnzipBaseDir(hZip, sDstDir);
  504 + ZIPENTRY stuZipentry;
  505 + GetZipItem(hZip, -1, &stuZipentry);
  506 + int iTotalCount = stuZipentry.index;
  507 + for (int index = 0; index < iTotalCount; ++index)
  508 + {
  509 + Log("正在解压文件" + CString(stuZipentry.name));
  510 + GetZipItem(hZip, index, &stuZipentry);
  511 + UnzipItem(hZip, index, stuZipentry.name);
  512 + }
  513 + }
  514 +
  515 + if (hZip != NULL)
  516 + {
  517 + CloseZip(hZip);
  518 + hZip = NULL;
  519 + }
  520 +
  521 + Log("复制配置文件");
  522 + if (CopyFile(m_stuConfigData.sTempDir + ("\\") + m_sConfigFileName, m_stuConfigData.sAppDir + ("\\") + m_sConfigFileName, FALSE))
  523 + {
  524 + Log(m_sConfigFileName + " " + "文件复制成功。");
  525 + bResult = TRUE;
  526 + }
  527 + else
  528 + {
  529 + Log(m_sConfigFileName + " " + "文件复制失败。");
  530 + bResult = FALSE;
  531 + }
  532 +
  533 + DeleteDirectory(m_stuConfigData.sTempDir);
  534 +
  535 + return bResult;
  536 +}
0 537 \ No newline at end of file
... ...
client_auto_updata/AutoUpdate/AUDataManage.h 0 → 100644
  1 +#pragma once
  2 +#include "afxinet.h"
  3 +
  4 +#define WM_UPDATEPROCESS WM_USER + 1
  5 +#define WM_CRASH_CLOSE WM_USER + 2
  6 +
  7 +#define PROCESS_KILLCLIENT 1
  8 +#define PROCESS_DOWNLOADFILE 2
  9 +#define PROCESS_DELETEOLDFILE 3
  10 +#define PROCESS_UNZIP 4
  11 +#define PROCESS_COMPLETE 5
  12 +
  13 +typedef struct STU_CONFIG
  14 +{
  15 + CString sAppName;
  16 + CString sSelfName;
  17 + CString sVersion;
  18 + CString sAppDir;
  19 + CString sUpdateDir;
  20 + CString sTempDir;
  21 + CString sZipName;
  22 +
  23 + CString sServerIP;
  24 + CString sUserName;
  25 + CString sPassWord;
  26 +
  27 + STU_CONFIG operator= (STU_CONFIG& stuConfig)
  28 + {
  29 + sAppName = stuConfig.sAppName;
  30 + sSelfName = stuConfig.sSelfName;
  31 + sVersion = stuConfig.sVersion;
  32 + sAppDir = stuConfig.sAppDir;
  33 + sUpdateDir = stuConfig.sUpdateDir;
  34 + sTempDir = stuConfig.sTempDir;
  35 + sZipName = stuConfig.sZipName;
  36 + sServerIP = stuConfig.sServerIP;
  37 + sUserName = stuConfig.sUserName;
  38 + sPassWord = stuConfig.sPassWord;
  39 + return *this;
  40 + }
  41 +}APPConfig;
  42 +
  43 +extern void Log(CString sLog);
  44 +
  45 +
  46 +//class Lock
  47 +//{
  48 +//private:
  49 +// CCriticalSection m_cs;
  50 +//public:
  51 +// Lock(CCriticalSection cs) : m_cs(cs)
  52 +// {
  53 +// m_cs.Lock();
  54 +// }
  55 +// ~Lock()
  56 +// {
  57 +// m_cs.Unlock();
  58 +// }
  59 +//};
  60 +
  61 +class CAUDataManage
  62 +{
  63 +public:
  64 + static CAUDataManage *Instantialize();
  65 + static void DestoryInstance();
  66 + ~CAUDataManage();
  67 +
  68 +public:
  69 + BOOL CheckVersion();
  70 + void Update();
  71 + void RestartClient();
  72 +
  73 +private:
  74 + CAUDataManage();
  75 + CAUDataManage(const CAUDataManage &);
  76 + CAUDataManage& operator = (const CAUDataManage &);
  77 +
  78 + BOOL KillCilent(CString sClientName);
  79 + BOOL DownloadClientFile();
  80 + void CreateTempFolder();
  81 + void DeleteDirectory(CString sDirectory);
  82 + CString GetModulePath();
  83 + void ReplaceClientFile(CString sAppDir);
  84 + APPConfig ReadConfig(CString sConfigName);
  85 + void CopyClientFile(CString sSrcFile, CString sDstFile);
  86 + void DownloadFile(CString sSrcFile, CString sDstFile, CFtpConnection *pFtpConnection);
  87 +
  88 +private:
  89 + static CAUDataManage *m_pInstance;
  90 + static CCriticalSection m_csLocker;
  91 +
  92 + APPConfig m_stuConfigData;
  93 + CString m_sConfigFilePath;
  94 + CString m_sConfigFileName;
  95 + BOOL Unzip(CString sSrcDir, CString sDstDir);
  96 +};
  97 +
... ...
client_auto_updata/AutoUpdate/AutoUpdate.cpp 0 → 100644
  1 +
  2 +// AutoUpdate.cpp : 定义应用程序的类行为。
  3 +//
  4 +
  5 +#include "stdafx.h"
  6 +#include "AutoUpdate.h"
  7 +#include "AutoUpdateDlg.h"
  8 +#include "dbghelp.h"
  9 +
  10 +#ifdef _DEBUG
  11 +#define new DEBUG_NEW
  12 +#endif
  13 +
  14 +#pragma comment(lib, "dbghelp.lib")
  15 +
  16 +//异常处理 add by liuye 2016.9.23
  17 +LONG WINAPI ExceptionHandler(PEXCEPTION_POINTERS ExceptionPointer)
  18 +{
  19 + AfxMessageBox(_T("升级程序发生异常,请联系工作人员!"));
  20 + // Open the file
  21 +
  22 + CTime tmCurTime;
  23 + tmCurTime = CTime::GetCurrentTime();
  24 + CString sData = tmCurTime.Format(_T("%y%m%d"));
  25 + CString sDumpName = _T("AutoUpdate_") + sData + ".dmp";
  26 +
  27 + HANDLE hFile = CreateFile(sDumpName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  28 + if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
  29 + {
  30 + // Create the minidump
  31 + MINIDUMP_EXCEPTION_INFORMATION stuDump;
  32 + stuDump.ThreadId = GetCurrentThreadId();
  33 + stuDump.ExceptionPointers = ExceptionPointer;
  34 + stuDump.ClientPointers = FALSE;
  35 + MINIDUMP_TYPE emDumpType = MiniDumpNormal;
  36 + BOOL bCreateDump = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, emDumpType, (ExceptionPointer != 0) ? &stuDump : 0, 0, 0);
  37 +
  38 + if (!bCreateDump)
  39 + _tprintf(_T("MiniDumpWriteDump failed. Error: %u \n"), GetLastError());
  40 + else
  41 + _tprintf(_T("Minidump created.\n"));
  42 +
  43 + // Close the file
  44 + CloseHandle(hFile);
  45 +
  46 + CWinApp* pApp = AfxGetApp();
  47 + SendMessage(pApp->m_pMainWnd->m_hWnd, WM_CRASH_CLOSE, NULL, NULL);
  48 + }
  49 + else
  50 + {
  51 + _tprintf(_T("CreateFile failed. Error: %u \n"), GetLastError());
  52 + }
  53 + return EXCEPTION_EXECUTE_HANDLER;
  54 +}
  55 +
  56 +
  57 +// CAUAutoUpdateApp
  58 +
  59 +BEGIN_MESSAGE_MAP(CAUAutoUpdateApp, CWinApp)
  60 + ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
  61 +END_MESSAGE_MAP()
  62 +
  63 +
  64 +// CAUAutoUpdateApp 构造
  65 +
  66 +CAUAutoUpdateApp::CAUAutoUpdateApp()
  67 +{
  68 + // TODO: 在此处添加构造代码,
  69 + // 将所有重要的初始化放置在 InitInstance 中
  70 +}
  71 +
  72 +
  73 +// 唯一的一个 CAUAutoUpdateApp 对象
  74 +
  75 +CAUAutoUpdateApp theApp;
  76 +
  77 +
  78 +// CAUAutoUpdateApp 初始化
  79 +
  80 +BOOL CAUAutoUpdateApp::InitInstance()
  81 +{
  82 + CWinApp::InitInstance();
  83 +
  84 + SetUnhandledExceptionFilter(ExceptionHandler);
  85 +
  86 + // 创建 shell 管理器,以防对话框包含
  87 + // 任何 shell 树视图控件或 shell 列表视图控件。
  88 + CShellManager *pShellManager = new CShellManager;
  89 +
  90 + // 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题
  91 + CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
  92 +
  93 + // 标准初始化
  94 + // 如果未使用这些功能并希望减小
  95 + // 最终可执行文件的大小,则应移除下列
  96 + // 不需要的特定初始化例程
  97 + // 更改用于存储设置的注册表项
  98 + // TODO: 应适当修改该字符串,
  99 + // 例如修改为公司或组织名
  100 + SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
  101 +
  102 + CAUAutoUpdateDlg dlgUpdate;
  103 + m_pMainWnd = &dlgUpdate;
  104 +
  105 + INT_PTR nResponse = dlgUpdate.DoModal();
  106 + if (nResponse == IDOK)
  107 + {
  108 + // TODO: 在此放置处理何时用
  109 + // “确定”来关闭对话框的代码
  110 + }
  111 + else if (nResponse == IDCANCEL)
  112 + {
  113 + // TODO: 在此放置处理何时用
  114 + // “取消”来关闭对话框的代码
  115 + }
  116 + else if (nResponse == -1)
  117 + {
  118 + TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
  119 + TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
  120 + }
  121 +
  122 + CAUDataManage::Instantialize()->DestoryInstance();
  123 +
  124 + // 删除上面创建的 shell 管理器。
  125 + if (pShellManager != NULL)
  126 + {
  127 + delete pShellManager;
  128 + }
  129 +
  130 + // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
  131 + // 而不是启动应用程序的消息泵。
  132 + return FALSE;
  133 +}
  134 +
... ...
client_auto_updata/AutoUpdate/AutoUpdate.h 0 → 100644
  1 +
  2 +// AutoUpdate.h : PROJECT_NAME 应用程序的主头文件
  3 +//
  4 +
  5 +#pragma once
  6 +
  7 +#ifndef __AFXWIN_H__
  8 + #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
  9 +#endif
  10 +
  11 +#include "resource.h" // 主符号
  12 +
  13 +
  14 +// CAUAutoUpdateApp:
  15 +// 有关此类的实现,请参阅 AutoUpdate.cpp
  16 +//
  17 +
  18 +class CAUAutoUpdateApp : public CWinApp
  19 +{
  20 +public:
  21 + CAUAutoUpdateApp();
  22 +
  23 +// 重写
  24 +public:
  25 + virtual BOOL InitInstance();
  26 +
  27 +// 实现
  28 +
  29 + DECLARE_MESSAGE_MAP()
  30 +};
  31 +
  32 +extern CAUAutoUpdateApp theApp;
0 33 \ No newline at end of file
... ...
client_auto_updata/AutoUpdate/AutoUpdate.rc 0 → 100644
1 1 Binary files /dev/null and b/client_auto_updata/AutoUpdate/AutoUpdate.rc differ
... ...
client_auto_updata/AutoUpdate/AutoUpdate.vcxproj 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  3 + <ItemGroup Label="ProjectConfigurations">
  4 + <ProjectConfiguration Include="Debug|Win32">
  5 + <Configuration>Debug</Configuration>
  6 + <Platform>Win32</Platform>
  7 + </ProjectConfiguration>
  8 + <ProjectConfiguration Include="Release|Win32">
  9 + <Configuration>Release</Configuration>
  10 + <Platform>Win32</Platform>
  11 + </ProjectConfiguration>
  12 + </ItemGroup>
  13 + <PropertyGroup Label="Globals">
  14 + <ProjectGuid>{30A58DE1-4C62-4882-9730-638BF4209018}</ProjectGuid>
  15 + <RootNamespace>AutoUpdate</RootNamespace>
  16 + <Keyword>MFCProj</Keyword>
  17 + </PropertyGroup>
  18 + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  19 + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
  20 + <ConfigurationType>Application</ConfigurationType>
  21 + <UseDebugLibraries>true</UseDebugLibraries>
  22 + <PlatformToolset>v120</PlatformToolset>
  23 + <CharacterSet>MultiByte</CharacterSet>
  24 + <UseOfMfc>Static</UseOfMfc>
  25 + </PropertyGroup>
  26 + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
  27 + <ConfigurationType>Application</ConfigurationType>
  28 + <UseDebugLibraries>false</UseDebugLibraries>
  29 + <PlatformToolset>v120</PlatformToolset>
  30 + <WholeProgramOptimization>true</WholeProgramOptimization>
  31 + <CharacterSet>MultiByte</CharacterSet>
  32 + <UseOfMfc>Static</UseOfMfc>
  33 + </PropertyGroup>
  34 + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  35 + <ImportGroup Label="ExtensionSettings">
  36 + </ImportGroup>
  37 + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  38 + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  39 + </ImportGroup>
  40 + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  41 + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  42 + </ImportGroup>
  43 + <PropertyGroup Label="UserMacros" />
  44 + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  45 + <LinkIncremental>true</LinkIncremental>
  46 + <LibraryPath>D:\GitProject\AutoUpdate\AutoUpdate\AutoUpdate;$(LibraryPath)</LibraryPath>
  47 + </PropertyGroup>
  48 + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  49 + <LinkIncremental>false</LinkIncremental>
  50 + <LibraryPath>D:\GitProject\AutoUpdate\AutoUpdate\AutoUpdate;$(LibraryPath)</LibraryPath>
  51 + </PropertyGroup>
  52 + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  53 + <ClCompile>
  54 + <PrecompiledHeader>Use</PrecompiledHeader>
  55 + <WarningLevel>Level3</WarningLevel>
  56 + <Optimization>Disabled</Optimization>
  57 + <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions);_CRT_SECURE_NO_DEPRECATE</PreprocessorDefinitions>
  58 + <SDLCheck>true</SDLCheck>
  59 + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  60 + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
  61 + </ClCompile>
  62 + <Link>
  63 + <SubSystem>Windows</SubSystem>
  64 + <GenerateDebugInformation>true</GenerateDebugInformation>
  65 + <AdditionalLibraryDirectories>D:\GitProject\AutoUpdate\AutoUpdate\AutoUpdate\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
  66 + <AdditionalDependencies>dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
  67 + </Link>
  68 + <Midl>
  69 + <MkTypLibCompatible>false</MkTypLibCompatible>
  70 + <ValidateAllParameters>true</ValidateAllParameters>
  71 + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  72 + </Midl>
  73 + <ResourceCompile>
  74 + <Culture>0x0804</Culture>
  75 + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  76 + <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  77 + </ResourceCompile>
  78 + </ItemDefinitionGroup>
  79 + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  80 + <ClCompile>
  81 + <WarningLevel>Level3</WarningLevel>
  82 + <PrecompiledHeader>Use</PrecompiledHeader>
  83 + <Optimization>Disabled</Optimization>
  84 + <FunctionLevelLinking>true</FunctionLevelLinking>
  85 + <IntrinsicFunctions>true</IntrinsicFunctions>
  86 + <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions);_CRT_SECURE_NO_DEPRECATE</PreprocessorDefinitions>
  87 + <SDLCheck>true</SDLCheck>
  88 + <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  89 + </ClCompile>
  90 + <Link>
  91 + <SubSystem>Windows</SubSystem>
  92 + <GenerateDebugInformation>true</GenerateDebugInformation>
  93 + <EnableCOMDATFolding>true</EnableCOMDATFolding>
  94 + <OptimizeReferences>true</OptimizeReferences>
  95 + <AdditionalLibraryDirectories>D:\GitProject\AutoUpdate\AutoUpdate\AutoUpdate\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
  96 + <AdditionalDependencies>dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
  97 + </Link>
  98 + <Midl>
  99 + <MkTypLibCompatible>false</MkTypLibCompatible>
  100 + <ValidateAllParameters>true</ValidateAllParameters>
  101 + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  102 + </Midl>
  103 + <ResourceCompile>
  104 + <Culture>0x0804</Culture>
  105 + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  106 + <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  107 + </ResourceCompile>
  108 + </ItemDefinitionGroup>
  109 + <ItemGroup>
  110 + <Text Include="ReadMe.txt" />
  111 + </ItemGroup>
  112 + <ItemGroup>
  113 + <ClInclude Include="AUDataManage.h" />
  114 + <ClInclude Include="AutoUpdate.h" />
  115 + <ClInclude Include="AutoUpdateDlg.h" />
  116 + <ClInclude Include="Resource.h" />
  117 + <ClInclude Include="stdafx.h" />
  118 + <ClInclude Include="targetver.h" />
  119 + <ClInclude Include="tinystr.h" />
  120 + <ClInclude Include="tinyxml.h" />
  121 + <ClInclude Include="zlib\unzip.h" />
  122 + <ClInclude Include="zlib\zip.h" />
  123 + </ItemGroup>
  124 + <ItemGroup>
  125 + <ClCompile Include="AUDataManage.cpp" />
  126 + <ClCompile Include="AutoUpdate.cpp" />
  127 + <ClCompile Include="AutoUpdateDlg.cpp" />
  128 + <ClCompile Include="stdafx.cpp">
  129 + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
  130 + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
  131 + </ClCompile>
  132 + <ClCompile Include="tinystr.cpp" />
  133 + <ClCompile Include="tinyxml.cpp" />
  134 + <ClCompile Include="tinyxmlerror.cpp" />
  135 + <ClCompile Include="tinyxmlparser.cpp" />
  136 + <ClCompile Include="zlib\unzip.cpp" />
  137 + <ClCompile Include="zlib\zip.cpp" />
  138 + </ItemGroup>
  139 + <ItemGroup>
  140 + <ResourceCompile Include="AutoUpdate.rc" />
  141 + </ItemGroup>
  142 + <ItemGroup>
  143 + <None Include="res\AutoUpdate.rc2" />
  144 + </ItemGroup>
  145 + <ItemGroup>
  146 + <Image Include="res\AutoUpdate.ico" />
  147 + </ItemGroup>
  148 + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  149 + <ImportGroup Label="ExtensionTargets">
  150 + </ImportGroup>
  151 + <ProjectExtensions>
  152 + <VisualStudio>
  153 + <UserProperties RESOURCE_FILE="AutoUpdate.rc" />
  154 + </VisualStudio>
  155 + </ProjectExtensions>
  156 +</Project>
0 157 \ No newline at end of file
... ...
client_auto_updata/AutoUpdate/AutoUpdate.vcxproj.filters 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  3 + <ItemGroup>
  4 + <Filter Include="源文件">
  5 + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
  6 + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
  7 + </Filter>
  8 + <Filter Include="头文件">
  9 + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
  10 + <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
  11 + </Filter>
  12 + <Filter Include="资源文件">
  13 + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
  14 + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
  15 + </Filter>
  16 + </ItemGroup>
  17 + <ItemGroup>
  18 + <Text Include="ReadMe.txt" />
  19 + </ItemGroup>
  20 + <ItemGroup>
  21 + <ClInclude Include="AutoUpdate.h">
  22 + <Filter>头文件</Filter>
  23 + </ClInclude>
  24 + <ClInclude Include="AutoUpdateDlg.h">
  25 + <Filter>头文件</Filter>
  26 + </ClInclude>
  27 + <ClInclude Include="stdafx.h">
  28 + <Filter>头文件</Filter>
  29 + </ClInclude>
  30 + <ClInclude Include="targetver.h">
  31 + <Filter>头文件</Filter>
  32 + </ClInclude>
  33 + <ClInclude Include="Resource.h">
  34 + <Filter>头文件</Filter>
  35 + </ClInclude>
  36 + <ClInclude Include="AUDataManage.h">
  37 + <Filter>头文件</Filter>
  38 + </ClInclude>
  39 + <ClInclude Include="tinystr.h">
  40 + <Filter>头文件</Filter>
  41 + </ClInclude>
  42 + <ClInclude Include="tinyxml.h">
  43 + <Filter>头文件</Filter>
  44 + </ClInclude>
  45 + <ClInclude Include="zlib\unzip.h">
  46 + <Filter>头文件</Filter>
  47 + </ClInclude>
  48 + <ClInclude Include="zlib\zip.h">
  49 + <Filter>头文件</Filter>
  50 + </ClInclude>
  51 + </ItemGroup>
  52 + <ItemGroup>
  53 + <ClCompile Include="AutoUpdate.cpp">
  54 + <Filter>源文件</Filter>
  55 + </ClCompile>
  56 + <ClCompile Include="AutoUpdateDlg.cpp">
  57 + <Filter>源文件</Filter>
  58 + </ClCompile>
  59 + <ClCompile Include="stdafx.cpp">
  60 + <Filter>源文件</Filter>
  61 + </ClCompile>
  62 + <ClCompile Include="AUDataManage.cpp">
  63 + <Filter>源文件</Filter>
  64 + </ClCompile>
  65 + <ClCompile Include="tinystr.cpp">
  66 + <Filter>源文件</Filter>
  67 + </ClCompile>
  68 + <ClCompile Include="tinyxml.cpp">
  69 + <Filter>源文件</Filter>
  70 + </ClCompile>
  71 + <ClCompile Include="tinyxmlerror.cpp">
  72 + <Filter>源文件</Filter>
  73 + </ClCompile>
  74 + <ClCompile Include="tinyxmlparser.cpp">
  75 + <Filter>源文件</Filter>
  76 + </ClCompile>
  77 + <ClCompile Include="zlib\unzip.cpp">
  78 + <Filter>源文件</Filter>
  79 + </ClCompile>
  80 + <ClCompile Include="zlib\zip.cpp">
  81 + <Filter>源文件</Filter>
  82 + </ClCompile>
  83 + </ItemGroup>
  84 + <ItemGroup>
  85 + <ResourceCompile Include="AutoUpdate.rc">
  86 + <Filter>资源文件</Filter>
  87 + </ResourceCompile>
  88 + </ItemGroup>
  89 + <ItemGroup>
  90 + <None Include="res\AutoUpdate.rc2">
  91 + <Filter>资源文件</Filter>
  92 + </None>
  93 + </ItemGroup>
  94 + <ItemGroup>
  95 + <Image Include="res\AutoUpdate.ico">
  96 + <Filter>资源文件</Filter>
  97 + </Image>
  98 + </ItemGroup>
  99 +</Project>
0 100 \ No newline at end of file
... ...
client_auto_updata/AutoUpdate/AutoUpdateDlg.cpp 0 → 100644
  1 +
  2 +// AutoUpdateDlg.cpp : 实现文件
  3 +//
  4 +
  5 +#include "stdafx.h"
  6 +#include "AutoUpdate.h"
  7 +#include "AutoUpdateDlg.h"
  8 +#include "afxdialogex.h"
  9 +
  10 +
  11 +
  12 +#ifdef _DEBUG
  13 +#define new DEBUG_NEW
  14 +#endif
  15 +
  16 +const int CLIENT_WIDTH = 500;
  17 +const int CLIENT_HEIGHT = 200;
  18 +const int PROCESS_HEIGHT = 40;
  19 +const int BOARD_HEIGHT = 40;
  20 +const int BOARD_WIDTH = 7;
  21 +const int SPACE_SIZE = 2;
  22 +
  23 +// CAUCheckVerDlg 对话框
  24 +
  25 +UINT Updata(LPVOID lpParam)
  26 +{
  27 + CAUDataManage::Instantialize()->Update();
  28 + return 0;
  29 +}
  30 +
  31 +CAUAutoUpdateDlg::CAUAutoUpdateDlg(CWnd* pParent /*=NULL*/)
  32 + : CDialogEx(CAUAutoUpdateDlg::IDD, pParent)
  33 +{
  34 + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  35 + m_pDataManage = CAUDataManage::Instantialize();
  36 +}
  37 +
  38 +void CAUAutoUpdateDlg::DoDataExchange(CDataExchange* pDX)
  39 +{
  40 + CDialogEx::DoDataExchange(pDX);
  41 + DDX_Control(pDX, IDC_EDIT_NOTICE, m_editNotice);
  42 + DDX_Control(pDX, IDC_PROGRESS_UPDATE, m_progressUpdate);
  43 +}
  44 +
  45 +BEGIN_MESSAGE_MAP(CAUAutoUpdateDlg, CDialogEx)
  46 + ON_WM_PAINT()
  47 + ON_WM_QUERYDRAGICON()
  48 + ON_MESSAGE(WM_UPDATEPROCESS, CAUAutoUpdateDlg::UpdateView)
  49 + ON_MESSAGE(WM_CRASH_CLOSE, CAUAutoUpdateDlg::SafeClose)
  50 +END_MESSAGE_MAP()
  51 +
  52 +
  53 +// CAUCheckVerDlg 消息处理程序
  54 +
  55 +BOOL CAUAutoUpdateDlg::OnInitDialog()
  56 +{
  57 + CDialogEx::OnInitDialog();
  58 +
  59 + // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
  60 + // 执行此操作
  61 + SetIcon(m_hIcon, TRUE); // 设置大图标
  62 + SetIcon(m_hIcon, FALSE); // 设置小图标
  63 +
  64 + ShowWindow(SW_HIDE);
  65 +
  66 + Log("检查更新。");
  67 + if (!m_pDataManage->CheckVersion())
  68 + {
  69 + if (IDOK == MessageBox(_T("检查到有新版本,是否升级?"), _T("版本升级"), MB_OKCANCEL))
  70 + {
  71 + Log("确认升级。");
  72 + SetUpdateView();
  73 + AfxBeginThread(Updata, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
  74 + }
  75 + else
  76 + {
  77 + Log("暂不升级。");
  78 + SendMessage(WM_CLOSE);
  79 + }
  80 + }
  81 + else
  82 + {
  83 + Log("已经是最新版本。");
  84 + SendMessage(WM_CLOSE);
  85 + }
  86 +
  87 + return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  88 +}
  89 +
  90 +// 如果向对话框添加最小化按钮,则需要下面的代码
  91 +// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
  92 +// 这将由框架自动完成。
  93 +
  94 +void CAUAutoUpdateDlg::OnPaint()
  95 +{
  96 + if (IsIconic())
  97 + {
  98 + CPaintDC dc(this); // 用于绘制的设备上下文
  99 +
  100 + SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  101 +
  102 + // 使图标在工作区矩形中居中
  103 + int cxIcon = GetSystemMetrics(SM_CXICON);
  104 + int cyIcon = GetSystemMetrics(SM_CYICON);
  105 + CRect rect;
  106 + GetClientRect(&rect);
  107 + int x = (rect.Width() - cxIcon + 1) / 2;
  108 + int y = (rect.Height() - cyIcon + 1) / 2;
  109 +
  110 + // 绘制图标
  111 + dc.DrawIcon(x, y, m_hIcon);
  112 + }
  113 + else
  114 + {
  115 + CDialogEx::OnPaint();
  116 + }
  117 +}
  118 +
  119 +//当用户拖动最小化窗口时系统调用此函数取得光标
  120 +//显示。
  121 +HCURSOR CAUAutoUpdateDlg::OnQueryDragIcon()
  122 +{
  123 + return static_cast<HCURSOR>(m_hIcon);
  124 +}
  125 +
  126 +void CAUAutoUpdateDlg::SetUpdateView()
  127 +{
  128 + ShowWindow(SW_SHOW);
  129 +
  130 + CRect rtCLient;
  131 + GetClientRect(&rtCLient);
  132 + ClientToScreen(&rtCLient);
  133 + int iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  134 + int iScreenHeight = GetSystemMetrics(SM_CYSCREEN);
  135 +
  136 + rtCLient.left = iScreenWidth / 2 - CLIENT_WIDTH / 2;
  137 + rtCLient.top = iScreenHeight / 2 - CLIENT_HEIGHT / 2;
  138 + rtCLient.right = rtCLient.left + CLIENT_WIDTH;
  139 + rtCLient.bottom = rtCLient.top + CLIENT_HEIGHT;
  140 + MoveWindow(rtCLient);
  141 +
  142 + m_progressUpdate.SetRange(0, 100);
  143 + CRect rtProgess;
  144 + rtProgess.left = SPACE_SIZE;
  145 + rtProgess.right = CLIENT_WIDTH - BOARD_WIDTH * 2 - SPACE_SIZE * 2;
  146 + rtProgess.bottom = CLIENT_HEIGHT - SPACE_SIZE - BOARD_HEIGHT;
  147 + rtProgess.top = rtProgess.bottom - PROCESS_HEIGHT;
  148 + m_progressUpdate.MoveWindow(rtProgess);
  149 +
  150 + SetNoticeText("正在升级请稍后······");
  151 + CRect rtEdit;
  152 + rtEdit.left = rtProgess.left;
  153 + rtEdit.right = rtProgess.right;
  154 + rtEdit.top = SPACE_SIZE;
  155 + rtEdit.bottom = rtProgess.top - SPACE_SIZE * 2;
  156 + m_editNotice.MoveWindow(&rtEdit);
  157 +
  158 +}
  159 +
  160 +LRESULT CAUAutoUpdateDlg::UpdateView(WPARAM wParam, LPARAM lParam)
  161 +{
  162 + if ((int)lParam == PROCESS_KILLCLIENT)
  163 + {
  164 + Log("正在关闭应用程序。");
  165 + SetNoticeText("正在关闭应用程序");
  166 + m_progressUpdate.OffsetPos(1);
  167 + }
  168 + else if ((int)lParam == PROCESS_DOWNLOADFILE)
  169 + {
  170 + Log("正在下载文件。");
  171 + SetNoticeText("正在下载文件");
  172 + m_progressUpdate.OffsetPos(10);
  173 + }
  174 + else if ((int)lParam == PROCESS_DELETEOLDFILE)
  175 + {
  176 + Log("正在删除旧文件。");
  177 + SetNoticeText("正在删除旧文件");
  178 + m_progressUpdate.OffsetPos(60);
  179 + }
  180 + else if ((int)lParam == PROCESS_UNZIP)
  181 + {
  182 + Log("正在解压文件。");
  183 + SetNoticeText("正在解压文件");
  184 + m_progressUpdate.OffsetPos(80);
  185 + }
  186 + else if ((int)lParam == PROCESS_COMPLETE)
  187 + {
  188 + Log("客户端更新完成。");
  189 + SetNoticeText("客户端更新完成");
  190 + m_progressUpdate.OffsetPos(100);
  191 + MessageBox(_T("客户端更新完成!"));
  192 + m_pDataManage->RestartClient();
  193 + SendMessage(WM_CLOSE);
  194 + }
  195 +
  196 + return NULL;
  197 +}
  198 +
  199 +void CAUAutoUpdateDlg::SetNoticeText(CString sNotice)
  200 +{
  201 + CString sNewText;
  202 + CString sOldText;
  203 + m_editNotice.GetWindowText(sOldText);
  204 +
  205 + if (!sOldText.IsEmpty())
  206 + {
  207 + sNewText = sOldText + "\r\n" + sNotice;
  208 + }
  209 + else
  210 + {
  211 + sNewText = sNotice;
  212 + }
  213 +
  214 + m_editNotice.SetWindowText(sNewText);
  215 +}
  216 +
  217 +LRESULT CAUAutoUpdateDlg::SafeClose(WPARAM wParam, LPARAM lParam)
  218 +{
  219 + SendMessage(WM_CLOSE);
  220 + return NULL;
  221 +}
  222 +
  223 +
... ...
client_auto_updata/AutoUpdate/AutoUpdateDlg.h 0 → 100644
  1 +
  2 +// AutoUpdateDlg.h : 头文件
  3 +//
  4 +
  5 +#pragma once
  6 +#include "AUDataManage.h"
  7 +#include "afxwin.h"
  8 +#include "afxcmn.h"
  9 +
  10 +
  11 +// CAUCheckVerDlg 对话框
  12 +class CAUAutoUpdateDlg : public CDialogEx
  13 +{
  14 +// 构造
  15 +public:
  16 + CAUAutoUpdateDlg(CWnd* pParent = NULL); // 标准构造函数
  17 +
  18 +// 对话框数据
  19 + enum { IDD = IDD_AUTOUPDATE_DIALOG };
  20 +
  21 + protected:
  22 + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  23 +
  24 +
  25 +// 实现
  26 +protected:
  27 + HICON m_hIcon;
  28 +
  29 + // 生成的消息映射函数
  30 + virtual BOOL OnInitDialog();
  31 + afx_msg void OnPaint();
  32 + afx_msg HCURSOR OnQueryDragIcon();
  33 + DECLARE_MESSAGE_MAP()
  34 +
  35 +private:
  36 + //CAUDataManage m_cDataManage;
  37 + CAUDataManage* m_pDataManage;
  38 + CEdit m_editNotice;
  39 + CProgressCtrl m_progressUpdate;
  40 +
  41 +private:
  42 + void SetUpdateView();
  43 + afx_msg LRESULT UpdateView(WPARAM wParam, LPARAM lParam);
  44 + afx_msg LRESULT SafeClose(WPARAM wParam, LPARAM lParam);
  45 + void SetNoticeText(CString sNotice);
  46 +};
... ...
client_auto_updata/AutoUpdate/ReadMe.txt 0 → 100644
  1 +================================================================================
  2 + MICROSOFT 基础类库 : AutoUpdate 项目概述
  3 +===============================================================================
  4 +
  5 +应用程序向导已为您创建了此 AutoUpdate 应用程序。此应用程序不仅演示 Microsoft 基础类的基本使用方法,还可作为您编写应用程序的起点。
  6 +
  7 +本文件概要介绍组成 AutoUpdate 应用程序的每个文件的内容。
  8 +
  9 +AutoUpdate.vcxproj
  10 + 这是使用应用程序向导生成的 VC++ 项目的主项目文件,其中包含生成该文件的 Visual C++ 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
  11 +
  12 +AutoUpdate.vcxproj.filters
  13 + 这是使用“应用程序向导”生成的 VC++ 项目筛选器文件。它包含有关项目文件与筛选器之间的关联信息。在 IDE 中,通过这种关联,在特定节点下以分组形式显示具有相似扩展名的文件。例如,“.cpp”文件与“源文件”筛选器关联。
  14 +
  15 +AutoUpdate.h
  16 + 这是应用程序的主头文件。
  17 + 其中包括其他项目特定的标头(包括 Resource.h),并声明 CAUAutoUpdateApp 应用程序类。
  18 +
  19 +AutoUpdate.cpp
  20 + 这是包含应用程序类 CAUAutoUpdateApp 的主应用程序源文件。
  21 +
  22 +AutoUpdate.rc
  23 + 这是程序使用的所有 Microsoft Windows 资源的列表。它包括 RES 子目录中存储的图标、位图和光标。此文件可以直接在 Microsoft Visual C++ 中进行编辑。项目资源包含在 2052 中。
  24 +
  25 +res\AutoUpdate.ico
  26 + 这是用作应用程序图标的图标文件。此图标包括在主资源文件 AutoUpdate.rc 中。
  27 +
  28 +res\AutoUpdate.rc2
  29 + 此文件包含不在 Microsoft Visual C++ 中进行编辑的资源。您应该将不可由资源编辑器编辑的所有资源放在此文件中。
  30 +
  31 +
  32 +/////////////////////////////////////////////////////////////////////////////
  33 +
  34 +应用程序向导创建一个对话框类:
  35 +
  36 +AutoUpdateDlg.h、AutoUpdateDlg.cpp - 对话框
  37 + 这些文件包含 CAUCheckVerDlg 类。此类定义应用程序的主对话框的行为。对话框模板包含在 AutoUpdate.rc 中,该文件可以在 Microsoft Visual C++ 中编辑。
  38 +
  39 +/////////////////////////////////////////////////////////////////////////////
  40 +
  41 +其他标准文件:
  42 +
  43 +StdAfx.h, StdAfx.cpp
  44 + 这些文件用于生成名为 AutoUpdate.pch 的预编译头 (PCH) 文件和名为 StdAfx.obj 的预编译类型文件。
  45 +
  46 +Resource.h
  47 + 这是标准头文件,可用于定义新的资源 ID。Microsoft Visual C++ 将读取并更新此文件。
  48 +
  49 +/////////////////////////////////////////////////////////////////////////////
  50 +
  51 +其他注释:
  52 +
  53 +应用程序向导使用“TODO:”来指示应添加或自定义的源代码部分。
  54 +
  55 +如果应用程序使用共享 DLL 中的 MFC,您将需要重新分发 MFC DLL。如果应用程序所使用的语言与操作系统的区域设置不同,则还需要重新分发相应的本地化资源 mfc110XXX.DLL。
  56 +有关上述话题的更多信息,请参见 MSDN 文档中有关重新分发 Visual C++ 应用程序的部分。
  57 +
  58 +/////////////////////////////////////////////////////////////////////////////
... ...