AutoupdateDlg.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:23k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // AutoupdateDlg.cpp : implementation file
  2. //
  3. /*
  4.   作者:WPS万里,常齐 
  5.   时间:2003年6 -7月
  6.   版本:1.0
  7.   功能:自动更新界面,通过对话框界面调用动态库UpdateDLL,并通过函数AutoUpdateDLL
  8.   调用接口,动态库通过回调函数RefreshStatus,  来表明自己的状态,界面通过g_dlgInfo 
  9.   来取得自动更新内核的状态。并表现在界面上
  10. */
  11. #include "stdafx.h"
  12. #include "Autoupdate.h"
  13. #include "AutoupdateDlg.h"
  14. #include "SiteDlg.h"
  15. #include "StartDlg.h"
  16. char url[MAX_PATH];
  17. int height = 500;
  18. CAutoupdateDlg *dlg = NULL;
  19. bool bStop = false;
  20. #include "../UPDATEDLL/src/UpdateExport.h"
  21. #include "../engine/Src/KWin32.h"
  22. #include "../engine/Src/KIniFile.h"
  23. #include "../engine/Src/KFilePath.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. BITMAP bmp;
  30. BOOL bRetry = FALSE;
  31. bool bRunning = false;
  32. bool bReboot = false;
  33. bool bEnterGame = false;
  34. BOOL OnExecute(LPCSTR szFile)
  35. {
  36.     STARTUPINFO si;
  37.     PROCESS_INFORMATION pi;
  38.     ZeroMemory( &si, sizeof(si) );
  39.     si.cb = sizeof(si);
  40. ::GetStartupInfo(&si);
  41.     ZeroMemory( &pi, sizeof(pi) );
  42. char buffer[256];
  43. strcpy(buffer, szFile);
  44. BOOL bRet = TRUE;
  45.     if( !CreateProcess( NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
  46. bRet = FALSE;
  47.     }
  48.     CloseHandle(pi.hProcess);
  49.     CloseHandle(pi.hThread);
  50. return bRet;
  51. }
  52. void DisplayErrorInfo(string& ErrorInfo) {
  53. LPVOID lpMsgBuf;
  54. FormatMessage( 
  55. FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  56. FORMAT_MESSAGE_FROM_SYSTEM | 
  57. FORMAT_MESSAGE_IGNORE_INSERTS,
  58. NULL,
  59. GetLastError(),
  60. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  61. (LPTSTR) &lpMsgBuf,
  62. 0,
  63. NULL 
  64. );
  65. MessageBox( NULL, ErrorInfo.c_str(),(LPCTSTR)lpMsgBuf , MB_OK |MB_ICONWARNING );
  66. LocalFree( lpMsgBuf );
  67. }
  68. //回调函数,直接在这里显示状态
  69. int __stdcall RefreshStatus(int nCurrentStatus, long lParam)
  70. {
  71. if(bStop) return bStop;
  72. LPDOWNLOADFILESTATUS pFileinfo = NULL;
  73. //根据由UpdateSet传经来的状态值nCurrentStatus 对状态信息Info给与相应的状态值
  74. switch(nCurrentStatus)
  75. {
  76. case defUPDATE_STATUS_INITIALIZING:
  77. dlg->m_DisplayVersionCtl.SetWindowText("正在连接服务器...");
  78. dlg->m_progress.SetPos(20);
  79. break;
  80. case defUPDATE_STATUS_VERIFING:
  81. dlg->m_DisplayVersionCtl.SetWindowText("正在进行用户校验...");
  82. dlg->m_progress.SetPos(40);
  83. break;
  84. case defUPDATE_RESULT_VERSION_NOT_ENOUGH:
  85. {
  86. strcpy(url, (char *)lParam);
  87. AnnuncePanel NeedDownAnnuncePanel;
  88. strcpy(NeedDownAnnuncePanel.url, url);
  89. NeedDownAnnuncePanel.m_ResModule = dlg->m_ResModule;
  90. NeedDownAnnuncePanel.DoModal();
  91. bStop = true;
  92. }
  93. //需要一次性手动升级包
  94. break;
  95. case defUPDATE_STATUS_PROCESSING_INDEX:
  96. dlg->m_DisplayVersionCtl.SetWindowText("正在下载更新信息...");
  97. dlg->m_progress.SetPos(60);
  98. break;
  99. case defUPDATE_STATUS_DOWNLOADING:
  100. dlg->m_DisplayVersionCtl.SetWindowText("正在下载文件...");
  101. dlg->m_progress.SetPos(80);
  102. break;
  103. case defUPDATE_STATUS_DOWNLOADING_FILE:
  104. dlg->m_progress.SetPos(80);
  105. pFileinfo = (LPDOWNLOADFILESTATUS)lParam;
  106. if (pFileinfo) {
  107. CString strFile;
  108. strFile.Format("%s --- %d KB(%d KB)", pFileinfo->strFileName, pFileinfo->dwFileSize / 1024, pFileinfo->dwFileDownloadedSize / 1024);
  109. dlg->m_DisplayVersionCtl.SetWindowText(strFile);
  110. dlg->m_progressCurrent.SetPos((int)(pFileinfo->dwFileDownloadedSize * 100.0 / pFileinfo->dwFileSize));
  111. }
  112. break;
  113. case defUPDATE_STATUS_UPDATING:
  114. dlg->m_DisplayVersionCtl.SetWindowText("正在更新系统...");
  115. dlg->m_progress.SetPos(100);
  116. break;
  117. case defUPDATE_RESULT_UPDATE_SUCCESS:
  118. dlg->m_DisplayVersionCtl.SetWindowText("升级完成...");
  119. dlg->m_progress.SetPos(100);
  120. dlg->m_progressCurrent.SetPos(100);
  121. dlg->m_EnterGameButton.ShowWindow(SW_SHOW);
  122. dlg->m_CancelButton.ShowWindow(SW_HIDE);
  123. dlg->m_EnterGameButton.MoveWindow(bmp.bmWidth - 120, height - 60, 90, 24);
  124. dlg->m_EnterGameButton.EnableWindow(true);
  125. break;
  126. case defUPDATE_RESULT_VERSION_MORE:
  127. dlg->m_DisplayVersionCtl.SetWindowText("已经是最新版本,不需要升级");
  128. dlg->m_progress.SetPos(100);
  129. dlg->m_progressCurrent.SetPos(100);
  130. dlg->m_EnterGameButton.ShowWindow(SW_SHOW);
  131. dlg->m_CancelButton.ShowWindow(SW_HIDE);
  132. dlg->m_EnterGameButton.MoveWindow(bmp.bmWidth - 120, height - 60, 90, 24);
  133. dlg->m_EnterGameButton.EnableWindow(true);
  134. break;
  135. default:
  136. ASSERT(FALSE);
  137. }
  138. return bStop;
  139. }
  140. BOOL g_bLog = FALSE;
  141. typedef int (__stdcall *UPDATEA_INIT)(KUPDATE_SETTING UpdateSetting);
  142. typedef int (__stdcall *UPDATE_UNINIT)();
  143. typedef int (__stdcall *UPDATE_START)();
  144. typedef int (__stdcall *UPDATE_CANCEL)();
  145. UPDATEA_INIT g_Update_Init = NULL;
  146. UPDATE_UNINIT g_Update_UnInit = NULL;
  147. UPDATE_START g_Update_Start = NULL;
  148. UPDATE_START g_Update_Cancel = NULL;
  149. HMODULE hModule;
  150. UINT AutoUpdateDLL(char* pSite)
  151. {
  152.     KUPDATE_SETTING UpdateSet;
  153.     int nRetCode = 0;
  154.     CString sText;
  155. bRunning = true;
  156.     UpdateSet.bAutoTryNextHost = false;
  157.     UpdateSet.bUseVerify = false;
  158.     UpdateSet.bUseFastestHost = false;
  159.     UpdateSet.pfnCallBackProc = &RefreshStatus;
  160.     UpdateSet.ProxySetting.bUpdateAuth = true; 
  161.     UpdateSet.ProxySetting.nHostPort = 0;
  162.     UpdateSet.ProxySetting.nProxyMethod = PROXY_METHOD_DIRECT;
  163.     strcpy(UpdateSet.szVerifyInfo, "102400-010999-106075-054738");
  164.     UpdateSet.ProxySetting.szHostAddr[0] = '';
  165.     UpdateSet.ProxySetting.szPassword[0] = '';
  166.     UpdateSet.ProxySetting.szUserName[0] = '';
  167.     
  168. char szModulePath[MAX_PATH + 1];
  169. ::GetModuleFileName(NULL, szModulePath, (MAX_PATH + 1));
  170. char *pszOffset = NULL;
  171. pszOffset = strrchr(szModulePath, '\');
  172.     ASSERT(pszOffset);
  173. strcpy(UpdateSet.szMainExecute, pszOffset + 1);
  174.     pszOffset[1] = '';
  175.     strcpy(UpdateSet.szDownloadPath, szModulePath);
  176. strcat(UpdateSet.szDownloadPath, "Update\");
  177.     strcpy(UpdateSet.szUpdatePath, szModulePath);
  178. UpdateSet.nUpdateMode = 0;
  179. strncpy(UpdateSet.szUpdateSite, pSite, MAX_PATH);
  180. CString strVersion = szModulePath;
  181. UpdateSet.nVersion = ::GetPrivateProfileInt(
  182. "Version",
  183. "Version",
  184. 0,
  185. strVersion + "Version.cfg");
  186. CAutoupdateDlg* pDlg = (CAutoupdateDlg*)(AfxGetApp()->m_pMainWnd);
  187. UpdateSet.bLog = g_bLog;
  188. if (g_Update_Init == NULL || g_Update_UnInit == NULL || g_Update_Start == NULL) {
  189. goto Exit0;
  190. }
  191.     nRetCode = g_Update_Init(UpdateSet);
  192. Sleep(10);
  193.     if (nRetCode == defUPDATE_RESULT_INIT_FAILED)
  194.         goto Exit0;
  195.     nRetCode = g_Update_Start();
  196.     g_Update_UnInit();
  197. Exit0:
  198. UpdateSet.nVersion = ::GetPrivateProfileInt("Version", "Version", 0, strVersion + "Version.cfg");
  199. bRunning = false;
  200.     return nRetCode;
  201. }
  202. UINT UpdateThread(LPVOID p)
  203. {
  204. bStop = false;
  205. Sleep(10);
  206. dlg->m_DisplayProgressCtl.SetWindowText("总体更新进度");
  207. dlg->m_DisplayVersionCtl.SetWindowText("正在进行自动升级");
  208. dlg->m_DisplayCurrentCtl.SetWindowText("当前更新文件");
  209.     int ret = AutoUpdateDLL((char*)p);
  210. if (ret >= 0 && (ret == defUPDATE_RESULT_INIT_FAILED || ret == defUPDATE_RESULT_DOWNLOAD_INDEX_FAILED ||
  211. ret == defUPDATE_RESULT_PROCESS_INDEX_FAILED || ret == defUPDATE_RESULT_CONNECT_SERVER_FAILED ||
  212. ret == defUPDATE_RESULT_DOWNLOAD_FAILED)) {
  213. dlg->m_nCurrentHost++;
  214. if(dlg->m_nCurrentHost >= dlg->m_strHosts.GetSize()) {
  215. //dlg->m_DisplayVersionCtl.SetWindowText("无可用的更新服务器,您可以尝试进入游戏,但是可能会出现错误");
  216. dlg->m_DisplayVersionCtl.SetWindowText("无可用的更新服务器,请重试。");
  217. dlg->m_progress.SetPos(00);
  218. dlg->m_progressCurrent.SetPos(0);
  219. //dlg->m_EnterGameButton.ShowWindow(SW_SHOW);
  220. //dlg->m_EnterGameButton.EnableWindow();
  221. //dlg->m_EnterGameButton.MoveWindow(bmp.bmWidth - 106, height - 60, 90, 24);
  222. dlg->m_RetryButton.ShowWindow(SW_SHOW);
  223. dlg->m_EnterGameButton.EnableWindow(false);
  224. }
  225. else {
  226. dlg->UpdateFromCurrentHost();
  227. }
  228. }
  229. else if (ret == defUPDATE_RESULT_CANCEL) {
  230. dlg->EndDialog(IDCANCEL);
  231. // dlg->m_web.Stop();
  232. // dlg->EndDialog(IDCANCEL);
  233. }
  234. else if(ret == 100) {
  235. dlg->EndDialog(IDCANCEL);
  236. }
  237. else if(ret == 101) {
  238. // dlg->EndDialog(IDCANCEL);
  239. }
  240. else if (ret == defUPDATE_RESULT_UPDATESELF_SUCCESS) {
  241. //在此写入文件,避免下次还要选择升级服务器
  242. FILE *site_ini = fopen(dlg->m_strSiteList, "w+");
  243. if(site_ini) {
  244. char line[100];
  245. sprintf(line, "%dn", dlg->m_nCurrentHost);
  246. fputs(line, site_ini);
  247. for(int index = 0; index < dlg->m_strHosts.GetSize(); index++) {
  248. sprintf(line, "%sn", dlg->m_strHosts[index]);
  249. fputs(line, site_ini);
  250. }
  251. fclose(site_ini);
  252. }
  253. ///* g_Update_Cancel();
  254. // dlg->m_web.Stop();
  255. if (!dlg->m_strUpdateSelf.IsEmpty()) {
  256. dlg->m_strRun.Empty();
  257. bReboot = true;
  258. }
  259. dlg->EndDialog(IDCANCEL);
  260. }
  261. else {
  262. dlg->m_DisplayVersionCtl.SetWindowText("升级完成...");
  263. dlg->m_progress.SetPos(100);
  264. dlg->m_progressCurrent.SetPos(100);
  265. dlg->m_EnterGameButton.ShowWindow(SW_SHOW);
  266. dlg->m_CancelButton.ShowWindow(SW_HIDE);
  267. dlg->m_EnterGameButton.MoveWindow(bmp.bmWidth - 120, height - 60, 90, 24);
  268. dlg->m_EnterGameButton.EnableWindow(true);
  269. }
  270. //读取版本号
  271. char aCfgPath[MAX_PATH];
  272. g_GetRootPath(aCfgPath);
  273. strcat(aCfgPath,"\Version.cfg");
  274. int aMajorVersion = ::GetPrivateProfileInt("Version", "MajorVersion", 0, aCfgPath);
  275. int aVersion = ::GetPrivateProfileInt("Version", "Version", 0, aCfgPath);
  276. aMajorVersion -= 1;
  277. if (aMajorVersion < 0) aMajorVersion = 0;
  278. CString aFormCaption = "剑侠情缘网络版(";
  279. char aIntStr[8];
  280. aFormCaption +="公测 ";
  281. itoa(aMajorVersion, aIntStr, 10);
  282. aFormCaption += aIntStr;
  283. if(aVersion <= 14)
  284. aVersion = 0;
  285. else
  286. aVersion -= 14;
  287. if(aVersion < 10)
  288. aFormCaption += ".0";
  289. else
  290. aFormCaption += ".";
  291. itoa(aVersion, aIntStr, 10);
  292. aFormCaption += aIntStr;
  293. aFormCaption += ")";
  294. ::SetWindowText(dlg->m_hWnd, aFormCaption);
  295. return ret;
  296. }
  297. /////////////////////////////////////////////////////////////////////////////
  298. // CAboutDlg dialog used for App About
  299. class CAboutDlg : public CDialog
  300. {
  301. public:
  302. CAboutDlg();
  303. // Dialog Data
  304. //{{AFX_DATA(CAboutDlg)
  305. enum { IDD = IDD_ABOUTBOX };
  306. //}}AFX_DATA
  307. // ClassWizard generated virtual function overrides
  308. //{{AFX_VIRTUAL(CAboutDlg)
  309. protected:
  310. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  311. //}}AFX_VIRTUAL
  312. // Implementation
  313. protected:
  314. //{{AFX_MSG(CAboutDlg)
  315. //}}AFX_MSG
  316. DECLARE_MESSAGE_MAP()
  317. };
  318. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  319. {
  320. //{{AFX_DATA_INIT(CAboutDlg)
  321. //}}AFX_DATA_INIT
  322. }
  323. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  324. {
  325. CDialog::DoDataExchange(pDX);
  326. //{{AFX_DATA_MAP(CAboutDlg)
  327. //}}AFX_DATA_MAP
  328. }
  329. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  330. //{{AFX_MSG_MAP(CAboutDlg)
  331. //}}AFX_MSG_MAP
  332. END_MESSAGE_MAP()
  333. /////////////////////////////////////////////////////////////////////////////
  334. // CAutoupdateDlg dialog
  335. const CString ResFileName = "AutoUpdateRes.dll";
  336. CAutoupdateDlg::CAutoupdateDlg(CWnd* pParent /*=NULL*/)
  337. : CDialog(CAutoupdateDlg::IDD, pParent) {
  338. //{{AFX_DATA_INIT(CAutoupdateDlg)
  339. m_strVersion = _T("");
  340. m_strProgress = _T("");
  341. m_strProgressCurrent = _T("");
  342. m_nCurrentHost = 0;//**内侧三
  343. //}}AFX_DATA_INIT
  344. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  345. }
  346. CAutoupdateDlg::~CAutoupdateDlg()
  347. {
  348. if(m_ResModule)
  349. {
  350. if(!FreeLibrary(m_ResModule))
  351. {                           
  352. // DisplayErrorInfo(string("FreeLibrary()"));
  353. }
  354.         m_ResModule = NULL;
  355. }
  356. //在此运行程序
  357. if(bReboot) {
  358. OnExecute(m_strUpdateSelf);
  359. }
  360. else if(bEnterGame) {
  361. OnExecute(m_strRun);
  362. }
  363. }
  364. void CAutoupdateDlg::DoDataExchange(CDataExchange* pDX)
  365. {
  366. CDialog::DoDataExchange(pDX);
  367. //{{AFX_DATA_MAP(CAutoupdateDlg)
  368. DDX_Control(pDX, IDC_RETRY, m_RetryButton);
  369. DDX_Control(pDX, IDC_REGUSER, m_RegUserCtl);
  370. DDX_Control(pDX, IDC_SINA, m_SinaCtl);
  371. DDX_Control(pDX, IDC_17173, m_17173Ctl);
  372. DDX_Control(pDX, IDC_HOME, m_HomeCtl);
  373. DDX_Control(pDX, IDC_JOYO, m_JoyoCtl);
  374. DDX_Control(pDX, IDC_CARD, m_CardCtl);
  375. DDX_Control(pDX, IDC_CONFIG, m_GameOption);
  376. DDX_Control(pDX, IDC_PROGRESSCURRENT, m_progressCurrent);
  377. DDX_Control(pDX, IDC_PROGRESS, m_progress);
  378. DDX_Control(pDX, IDC_STATIC_PROGRESS, m_DisplayProgressCtl);
  379. DDX_Control(pDX, IDC_STATIC_PROGRESSCURRENT, m_DisplayCurrentCtl);
  380. DDX_Control(pDX, IDC_STATIC_VERSON, m_DisplayVersionCtl);
  381. DDX_Control(pDX, IDC_REGISTER, m_RegisterCtl);
  382. DDX_Control(pDX, IDC_INVEST, m_InvestCtl);
  383. DDX_Control(pDX, IDCANCEL, m_CancelButton);
  384. DDX_Control(pDX, IDOK, m_EnterGameButton);
  385. DDX_Text(pDX, IDC_STATIC_VERSON, m_strVersion);
  386. DDX_Text(pDX, IDC_STATIC_PROGRESS, m_strProgress);
  387. DDX_Text(pDX, IDC_STATIC_PROGRESSCURRENT, m_strProgressCurrent);
  388. DDX_Control(pDX, IDC_EXPLORER1, m_web);
  389. //}}AFX_DATA_MAP
  390. }
  391. BEGIN_MESSAGE_MAP(CAutoupdateDlg, CDialog)
  392. //{{AFX_MSG_MAP(CAutoupdateDlg)
  393. ON_WM_SYSCOMMAND()
  394. ON_WM_PAINT()
  395. ON_WM_QUERYDRAGICON()
  396. ON_WM_DESTROY()
  397. ON_BN_CLICKED(IDC_REGISTER, OnRegister)
  398. ON_BN_CLICKED(IDC_INVEST, OnInvest)
  399. ON_WM_CTLCOLOR()
  400. ON_BN_CLICKED(IDC_CONFIG, OnConfig)
  401. ON_WM_TIMER()
  402. ON_BN_CLICKED(IDC_RETRY, OnRetry)
  403. //}}AFX_MSG_MAP
  404. END_MESSAGE_MAP()
  405. /////////////////////////////////////////////////////////////////////////////
  406. // CAutoupdateDlg message handlers
  407. const WindowWidth = 643;
  408. const WindowHeight = 530;
  409. BOOL CAutoupdateDlg::OnInitDialog()
  410. {
  411. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  412. CDialog::OnInitDialog();
  413. if (!m_strWebURL.IsEmpty()) {
  414. m_web.Navigate(m_strWebURL, NULL, NULL, NULL, NULL);
  415. }
  416. m_progress.SetRange(0, 100);
  417. m_progressCurrent.SetRange(0, 100);
  418. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  419. ASSERT(IDM_ABOUTBOX < 0xF000);
  420. SetIcon(m_hIcon, TRUE); // Set big icon
  421. SetIcon(m_hIcon, FALSE); // Set small icon
  422. m_ResModule = LoadLibrary(ResFileName);
  423. if(!m_ResModule) {
  424. DisplayErrorInfo(string("LoadLibrary()"));
  425. }
  426. LoadBitMapFromInstance(m_bmTitle, m_ResModule, IDB_TITLE);
  427. if (!((HBITMAP)m_bmTitle)) {
  428.     PostQuitMessage(1);
  429. }
  430. m_bmTitle.GetBitmap(&bmp);
  431.     CRect WindowRange(0,0,bmp.bmWidth, height);
  432. MoveWindow(WindowRange);
  433. CenterWindow(NULL);
  434. //读取版本号
  435. char aCfgPath[MAX_PATH];
  436. g_GetRootPath(aCfgPath);
  437. strcat(aCfgPath,"\Version.cfg");
  438. int aMajorVersion = ::GetPrivateProfileInt("Version", "MajorVersion", 0, aCfgPath);
  439. int aVersion = ::GetPrivateProfileInt("Version", "Version", 0, aCfgPath);
  440. aMajorVersion -= 1;
  441. if (aMajorVersion < 0) aMajorVersion = 0;
  442. CString aFormCaption = "剑侠情缘网络版(";
  443. char aIntStr[8];
  444. aFormCaption +="公测 ";
  445. itoa(aMajorVersion, aIntStr, 10);
  446. aFormCaption += aIntStr;
  447. if(aVersion <= 14)
  448. aVersion = 0;
  449. else
  450. aVersion -= 14;
  451. if(aVersion < 10)
  452. aFormCaption += ".0";
  453. else
  454. aFormCaption += ".";
  455. itoa(aVersion, aIntStr, 10);
  456. aFormCaption += aIntStr;
  457. aFormCaption += ")";
  458. ::SetWindowText(m_hWnd, aFormCaption);
  459. m_EnterGameButton.ShowWindow(SW_HIDE);
  460. m_RegisterCtl.ShowWindow(SW_HIDE);
  461. m_InvestCtl.ShowWindow(SW_HIDE);
  462. m_CancelButton.MoveWindow(bmp.bmWidth - 120, height - 60, 90, 24);
  463. m_RetryButton.MoveWindow(bmp.bmWidth - 220,  height - 60, 90, 24);
  464. m_EnterGameButton.EnableWindow(false);
  465. m_GameOption.MoveWindow(bmp.bmWidth - 120, bmp.bmHeight + 50, 90, 24);
  466. m_progress.MoveWindow(115, bmp.bmHeight + 35, bmp.bmWidth - 256, 15);
  467.     m_progressCurrent.MoveWindow(115, bmp.bmHeight + 60, bmp.bmWidth - 256, 15);
  468. m_DisplayVersionCtl.MoveWindow(10, bmp.bmHeight + 10, bmp.bmWidth - 240,15);
  469. m_DisplayProgressCtl.MoveWindow(10, bmp.bmHeight + 35, 100,15);
  470. m_DisplayCurrentCtl.MoveWindow(10, bmp.bmHeight + 60, 100,15);
  471. m_CardCtl.MoveWindow(14, height - 65, 70, 24);
  472. m_CardCtl.SetHyperlink("http://202.108.250.168/SwordOnline/showFillAction.do?action=fillvalue");
  473. m_RegUserCtl.MoveWindow(90, height - 65, 70, 24);
  474. m_RegUserCtl.SetHyperlink("http://202.108.250.168/SwordOnline/account.do?action=Create");
  475. m_HomeCtl.MoveWindow(166, height - 65, 70, 24);
  476. m_HomeCtl.SetHyperlink("http://www.jxonline.net");
  477. m_JoyoCtl.MoveWindow(19, height - 45, 70, 24);
  478. m_JoyoCtl.SetHyperlink("http://www.joyo.net/");
  479. m_SinaCtl.SetFontColor(RGB(255,0,0));
  480. m_SinaCtl.MoveWindow(90, height - 45, 70, 24);
  481. m_SinaCtl.SetHyperlink("http://games.sina.com.cn/z/jx/");
  482. m_17173Ctl.MoveWindow(166, height - 45, 70, 24);
  483. m_17173Ctl.SetHyperlink("http://jx.17173.com");
  484. m_web.MoveWindow(0, bmp.bmHeight + 85, bmp.bmWidth - 8, height - bmp.bmHeight - 160);
  485. // UpdateFinish.SetEvent();
  486. UpdateFromCurrentHost();
  487. // SetTimer(200, 50, NULL);
  488. dlg = this;
  489. //m_nCurrentHost = -1;
  490. m_bEnableRun = FALSE;
  491.     
  492. hModule = LoadLibrary("UpdateDLL.dll");
  493.     if (!hModule)
  494.         return FALSE;
  495.     g_Update_Init = (UPDATEA_INIT)GetProcAddress(hModule, "Update_Init");
  496.     if (!g_Update_Init)
  497.         return FALSE;
  498.     g_Update_UnInit = (UPDATE_UNINIT)GetProcAddress(hModule, "Update_UnInit");
  499.     if (!g_Update_UnInit)
  500.         return FALSE;
  501.     g_Update_Start = (UPDATE_START)GetProcAddress(hModule, "Update_Start");
  502.     if (!g_Update_Start)
  503.         return FALSE; 
  504. g_Update_Cancel = (UPDATE_START)GetProcAddress(hModule, "Update_Cancel");
  505.     if (!g_Update_Cancel)
  506.         return FALSE;
  507. return TRUE;  // return TRUE  unless you set the focus to a control
  508. }
  509. BOOL CAutoupdateDlg::InitAutoUpdate()
  510. {
  511. KIniFile IniFile;
  512. if (!IniFile.Load("\settings\autoupdate.ini"))
  513. return FALSE;
  514. char szWebURL[MAX_PATH];
  515. IniFile.GetString("main", "gameurl", "http://www.kingsoft.net/", szWebURL, MAX_PATH);
  516. m_strWebURL = szWebURL;
  517. char run[256];
  518. IniFile.GetString("main", "game", "s3client.exe", run, 256);
  519. char szModulePath[MAX_PATH + 1];
  520. g_GetRootPath(szModulePath);
  521. CString strPath = szModulePath;
  522. m_strRun = strPath + "\" + run;
  523. m_strUpdateSelf = strPath + "\Update\" + "UpdateSelf.DAT";
  524. m_strSiteList = strPath + "\Update\" + "SiteList.ini";
  525. m_nCurrentHost = -1;
  526. m_strHosts.RemoveAll();
  527. FILE *site_ini = fopen(m_strSiteList, "r");
  528. if(site_ini) {
  529. char line[100];
  530. while(fgets(line, 100, site_ini) != NULL) {
  531. if(m_nCurrentHost == -1) {
  532. m_nCurrentHost = atoi(line);
  533. if(m_nCurrentHost == -1) m_nCurrentHost = 0;
  534. }
  535. else {
  536. int last = strlen(line) - 1;
  537. if(line[last] == 'n') {
  538. line[last--] = 0;
  539. }
  540. if(line[last] == 'r') {
  541. line[last] = 0;
  542. }
  543. m_strHosts.Add(line);
  544. }
  545. }
  546. fclose(site_ini);
  547. remove(m_strSiteList);
  548. IniFile.GetInteger("main", "log", 0, &g_bLog);
  549. if(m_nCurrentHost >= m_strHosts.GetSize()) m_nCurrentHost = 0;
  550. return (m_strHosts.GetSize() >= 0);
  551. }
  552. char szSite[MAX_PATH];
  553. int n = 1;
  554. CString strSite;
  555. CStringArray strHosts;
  556. do {
  557. szSite[0] = 0;
  558. strSite.Format("ftpsite%d", n);
  559. IniFile.GetString("main", strSite, "", szSite, MAX_PATH);
  560. if (szSite[0] != 0)
  561. strHosts.Add(szSite);
  562. else
  563. break;
  564. n++;
  565. } while(szSite[0] != 0);
  566. if (strHosts.GetSize() > 0)
  567. {
  568. //在此打开一个对话框选择升级服务器
  569. CSiteDlg sites;
  570. sites.site_list = &strHosts;
  571. int nStart = rand() * GetTickCount() % strHosts.GetSize();
  572. sites.nStart = nStart;
  573. if(sites.DoModal() != IDOK) {
  574. return FALSE;
  575. }
  576. nStart = sites.nStart;
  577. int i;
  578. for (i = nStart; i < strHosts.GetSize(); i++)
  579. {
  580. m_strHosts.Add(strHosts[i]);
  581. }
  582. for (i = 0; i < nStart; i++)
  583. {
  584. m_strHosts.Add(strHosts[i]);
  585. }
  586. ASSERT(m_strHosts.GetSize() == strHosts.GetSize());
  587. m_nCurrentHost = 0;
  588. m_nConnectionStep = ConnectionProgress/(m_strHosts.GetSize());
  589. }
  590. else
  591. m_nCurrentHost = -1;
  592. IniFile.GetInteger("main", "log", 0, &g_bLog);
  593. return (m_nCurrentHost >= 0);
  594. }
  595. void CAutoupdateDlg::UpdateFromCurrentHost() {
  596. if (m_nCurrentHost >= 0 && m_nCurrentHost < m_strHosts.GetSize() )
  597. {
  598. AfxBeginThread(UpdateThread, (void*)(LPCTSTR)m_strHosts[m_nCurrentHost]);
  599. }
  600. }
  601. void CAutoupdateDlg::OnSysCommand(UINT nID, LPARAM lParam)
  602. {
  603. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  604. {
  605. CAboutDlg dlgAbout;
  606. dlgAbout.DoModal();
  607. }
  608. else
  609. {
  610. CDialog::OnSysCommand(nID, lParam);
  611. }
  612. }
  613. void CAutoupdateDlg::OnPaint() 
  614. {
  615. CPaintDC PaintDC(this); 
  616. if (IsIconic())
  617. {
  618. // Center icon in client rectangle
  619. int cxIcon = GetSystemMetrics(SM_CXICON);
  620. int cyIcon = GetSystemMetrics(SM_CYICON);
  621. CRect rect;
  622. GetClientRect(&rect);
  623. int x = (rect.Width() - cxIcon + 1) / 2;
  624. int y = (rect.Height() - cyIcon + 1) / 2;
  625. // Draw the icon
  626. PaintDC.DrawIcon(x, y, m_hIcon);
  627. }
  628. else {
  629. //画标题
  630.         CDC dc;
  631.         CBitmap *pOldBitmap = NULL;
  632. dc.CreateCompatibleDC(&PaintDC);
  633.         
  634.         pOldBitmap = dc.SelectObject(&m_bmTitle);
  635. PaintDC.BitBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &dc, 0, 0, SRCCOPY);
  636.         dc.SelectObject(pOldBitmap);
  637.        
  638. }
  639. }
  640. HCURSOR CAutoupdateDlg::OnQueryDragIcon() {
  641. return (HCURSOR) m_hIcon;
  642. }
  643. void CAutoupdateDlg::OnCancel() {
  644. m_web.Stop();
  645. CWnd* p = GetDlgItem(IDCANCEL);
  646. CString str;
  647. p->GetWindowText(str);
  648. m_DisplayVersionCtl.SetWindowText("取消升级...");
  649. m_progress.SetPos(0);
  650. m_progressCurrent.SetPos(0);
  651. bStop = true;
  652. if (g_Update_Cancel) {
  653. g_Update_Cancel();
  654. }
  655. EndDialog(IDCANCEL);
  656. }
  657. void CAutoupdateDlg::OnDestroy()
  658. {
  659. // WaitForSingleObject(UpdateFinish.m_hObject, INFINITE);
  660. while(bRunning) {
  661. Sleep(100);
  662. }
  663. if (hModule) {
  664.       FreeLibrary(hModule);
  665.   hModule = NULL;
  666. }
  667. CDialog::OnDestroy();
  668. }
  669. void CAutoupdateDlg::OnOK()
  670. {
  671. if (!m_strRun.IsEmpty())
  672. {
  673. bEnterGame = true;
  674. }
  675. EndDialog(IDOK);
  676. }
  677.  
  678. BEGIN_EVENTSINK_MAP(CAutoupdateDlg, CDialog)
  679.     //{{AFX_EVENTSINK_MAP(CAutoupdateDlg)
  680. ON_EVENT(CAutoupdateDlg, IDC_EXPLORER1, 271 /* NavigateError */, OnNavigateErrorExplorer1, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
  681. //}}AFX_EVENTSINK_MAP
  682. END_EVENTSINK_MAP()
  683. void CAutoupdateDlg::OnRegister() {
  684. // ShellExecute(NULL,"open","\\s\自动更新\剑侠情缘3网上交易平台.htm",NULL,NULL,SW_SHOW);
  685. }
  686. void CAutoupdateDlg::OnInvest() 
  687. {
  688. // ShellExecute(NULL,"open","\\s\自动更新\剑侠情缘3网上交易平台.htm",NULL,NULL,SW_SHOW);
  689. }
  690. void CAutoupdateDlg::LoadBitMapFromInstance(CBitmap &Dest, HINSTANCE Hinstance, WORD wResourceID) {
  691.     HBITMAP TempBitMap = LoadBitmap(Hinstance,MAKEINTRESOURCE(wResourceID));
  692. if(!TempBitMap) {
  693. DisplayErrorInfo(string("LoadBitmap()"));
  694. }
  695. if(!Dest.Attach(TempBitMap)) {
  696. DisplayErrorInfo(string("FromHandle()"));
  697. }
  698. }
  699. HBRUSH CAutoupdateDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
  700. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  701. if(nCtlColor == CTLCOLOR_STATIC   )
  702. {
  703. pDC->SetTextColor(RGB(102,101,98));
  704. // Set the background mode for text to transparent 
  705. // so background will show thru.
  706. pDC->SetBkMode(TRANSPARENT);
  707. }
  708. return hbr;
  709. }
  710. void CAutoupdateDlg::OnConfig() 
  711. {
  712. GameOptionPanel OptionInterface;
  713. OptionInterface.DoModal();
  714. }
  715. const char *HOME_PAGE = "http://www.jxonline.net";
  716. void CAutoupdateDlg::OnNavigateErrorExplorer1(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Frame, VARIANT FAR* StatusCode, BOOL FAR* Cancel) 
  717. {
  718. if(!bRetry) {
  719. bRetry = TRUE;
  720. m_web.Navigate(HOME_PAGE, NULL, NULL, NULL, NULL);
  721. }
  722. }
  723. void CAutoupdateDlg::OnRetry() 
  724. {
  725. //重试连接
  726. m_RetryButton.ShowWindow(SW_HIDE);
  727. m_CancelButton.ShowWindow(SW_SHOW);
  728. m_nCurrentHost = 0;
  729. UpdateFromCurrentHost();
  730. dlg = this;
  731. //m_nCurrentHost = -1;
  732. m_bEnableRun = FALSE;
  733. }