UpdatePage.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:35k
源码类别:

CA认证

开发平台:

Visual C++

  1. // UpdatePage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "minica.h"
  5. #include "MiniMainDlg.h"
  6. #include "UpdatePage.h"
  7. #include "Evp.h"
  8. #include ".GenericClassLanguage.h"
  9. #include "minict.h"
  10. #include "mmsystem.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CUpdatePage property page
  18. IMPLEMENT_DYNCREATE(CUpdatePage, CPropertyPage)
  19. CUpdatePage::CUpdatePage() : CPropertyPage(CUpdatePage::IDD)
  20. {
  21. //{{AFX_DATA_INIT(CUpdatePage)
  22. //}}AFX_DATA_INIT
  23. m_sExePath = ((CMiniCaApp *)AfxGetApp())->GetAppPath();//可执行文件路径
  24. m_sIniGuid = "{4238FF04-E193-46e4-97A9-177238839CD2}";//iniGUID
  25. m_sIniUrl = "http://minica.91i.net/minica/miniup.txt";
  26. m_TaskLen = m_UpLen = m_OneLen = 0;
  27. m_bUpdate = FALSE;
  28. m_bReset = TRUE;//默认重启
  29. m_pParent = NULL;
  30. }
  31. CUpdatePage::~CUpdatePage()
  32. {
  33. }
  34. void CUpdatePage::DoDataExchange(CDataExchange* pDX)
  35. {
  36. CPropertyPage::DoDataExchange(pDX);
  37. //{{AFX_DATA_MAP(CUpdatePage)
  38. DDX_Control(pDX, IDC_BUP, m_Bup);
  39. DDX_Control(pDX, IDC_PROGRESS2, m_Prog2);
  40. DDX_Control(pDX, IDC_PROGRESS1, m_Prog1);
  41. DDX_Control(pDX, IDC_LISTCTRL, m_UpList);
  42. //}}AFX_DATA_MAP
  43. }
  44. BEGIN_MESSAGE_MAP(CUpdatePage, CPropertyPage)
  45. //{{AFX_MSG_MAP(CUpdatePage)
  46. ON_BN_CLICKED(IDC_BUP, OnBup)
  47. ON_NOTIFY(NM_RCLICK, IDC_LISTCTRL, OnRclickListctrl)
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CUpdatePage message handlers
  52. //{4238FF04-E193-46e4-97A9-177238839CD2}
  53. BOOL CUpdatePage::OnInitDialog() 
  54. {
  55. CPropertyPage::OnInitDialog();
  56. m_Bup.SetThemeHelper(((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
  57. m_Bup.SetIcon(IDI_ICON17);
  58. m_Bup.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  59. // TODO: Add extra initialization here
  60. m_UpList.SetExtendedStyle(LVS_EX_UNDERLINECOLD|LVS_EX_FULLROWSELECT);
  61. CImageList * pImgList = ((CMiniCaApp *)AfxGetApp())->GetImgList();
  62. m_UpList.SetImageList(pImgList,LVSIL_SMALL);//用来改变LISTCTRL行宽度
  63. m_UpList.InsertColumn(0, MiniCT_1700, LVCFMT_LEFT,100); //下载文件
  64. m_UpList.InsertColumn(1, MiniCT_1701, LVCFMT_LEFT,100); //文件大小
  65. m_UpList.InsertColumn(2, MiniCT_1702, LVCFMT_LEFT,100); //状态
  66. m_UpList.InsertColumn(3, MiniCT_1703, LVCFMT_LEFT,50); //速度
  67. m_UpList.InsertColumn(4, MiniCT_1704, LVCFMT_LEFT,120); //文件描述
  68. m_pParent = GetParent();
  69. if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
  70. {
  71. m_Prog1.SetBitmap(IDB_BITMAP_PROG);
  72. m_Prog2.SetBitmap(IDB_BITMAP_PROG);
  73. }
  74. // CG: The following block was added by the ToolTips component. { // Create the ToolTip control. m_tooltip.Create(this); m_tooltip.Activate(TRUE); // TODO: Use one of the following forms to add controls: // m_tooltip.AddTool(GetDlgItem(IDC_<name>), <string-table-id>); // m_tooltip.AddTool(GetDlgItem(IDC_<name>), "<text>"); }
  75. return TRUE;  // return TRUE unless you set the focus to a control
  76.               // EXCEPTION: OCX Property Pages should return FALSE
  77. }
  78. UINT CUpdatePage::DownHttpFile(LPCTSTR lpszUrl, LPCTSTR lpszLocal,UINT uIndex,
  79.   LPCTSTR szFileName,
  80.   BOOL bShowProg)
  81. {
  82. DWORD dwFlags;
  83. DWORD dwResult = INTERNET_ERROR_OPEN;
  84. if(!InternetGetConnectedState(&dwFlags, 0))
  85. {
  86. AddEvent(M_ERROR, MiniCT_1705); //网络未连接
  87. return INTERNET_ERROR_OPEN;
  88. }
  89. if(dwFlags & INTERNET_CONNECTION_OFFLINE)//take appropriate steps
  90. {
  91. AddEvent(M_ERROR, MiniCT_1706); //离线连接
  92. return INTERNET_ERROR_OPEN;
  93. }
  94. CHAR strAgent[64]; //waring 如果 strAgent = {0} ,可能导致下载失败
  95. sprintf(strAgent, "Agent%ld", timeGetTime());
  96. HINTERNET hOpen;
  97. if(!(dwFlags & INTERNET_CONNECTION_PROXY))
  98. hOpen = InternetOpen(strAgent, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
  99. else
  100. hOpen = InternetOpen(strAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  101. if(hOpen)
  102. {
  103. LVITEM lvItem;
  104. lvItem.mask =  LVIF_IMAGE | LVIF_STATE; 
  105. lvItem.state = LVIS_SELECTED | LVIS_FOCUSED; 
  106.         lvItem.iItem = uIndex;
  107.         lvItem.iSubItem = 0;
  108. lvItem.iImage = 12;
  109. m_UpList.SetItem(&lvItem);//开始下载
  110. m_UpList.SetItemText(uIndex,2, MiniCT_1707); //下载中...
  111. dwResult = InternetGetFile(hOpen, lpszUrl, lpszLocal,uIndex,szFileName,bShowProg);//是否显示进度
  112. InternetCloseHandle(hOpen);
  113. return dwResult;
  114. }
  115. else 
  116. {
  117. GetLastError();
  118. return 0;
  119. }
  120. }
  121. UINT CUpdatePage::InternetGetFile (HINTERNET IN hOpen, // Handle from InternetOpen() //SetItemState(n,  LVIS_SELECTED,  LVIS_SELECTED);  //设置选中
  122.                  LPCTSTR  szUrl,        // Full URL
  123.                  LPCTSTR  szFilePath, UINT uIndex,/*列表中第几个文件*/ LPCTSTR szFileName,BOOL bShowProg)
  124. {
  125. DWORD dwSize;
  126. CHAR   szHead[] = "Accept: */*rnrn";
  127. VOID* szTemp[16384];
  128. HINTERNET  hConnect;
  129. FILE * pFile;
  130. if ( !(hConnect = InternetOpenUrl ( hOpen, szUrl, szHead,
  131. lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0)))
  132. {
  133. return INTERNET_ERROR_OPENURL;
  134. }
  135. if  ( !(pFile = fopen (szFilePath, "wb" ) ) )
  136. {
  137. return INTERNET_ERROR_FILEOPEN;
  138. }
  139. DWORD dwByteToRead = 0;
  140. DWORD dwSizeOfRq = 4;
  141. DWORD dwBytes = 0;
  142. if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, 
  143. (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL))
  144. {
  145. dwByteToRead = 0;
  146. }
  147. if(bShowProg)
  148. {
  149. char buf[300] = {0};
  150. wsprintf(buf,"%s%s...",MiniCT_1708, szFileName); //下载
  151. AddEvent(M_WARING,buf);
  152. }
  153. DWORD start;
  154. DWORD end;
  155. DWORD time;
  156. time = 10;
  157. start = timeGetTime();
  158. do
  159. {
  160. // Keep coping in 16 KB chunks, while file has any data left.
  161. // Note: bigger buffer will greatly improve performance.
  162. if (!InternetReadFile (hConnect, szTemp, 16384,  &dwSize) )
  163. {
  164. fclose (pFile);
  165. GetLastError();
  166.             return INTERNET_ERROR_READFILE;
  167. }
  168. if (!dwSize)
  169. break;  // Condition of dwSize=0 indicate EOF. Stop.
  170. else
  171. fwrite(szTemp, sizeof (char), dwSize , pFile);
  172. if(bShowProg)//显示进度
  173. {
  174. dwBytes += dwSize;
  175. m_UpLen += dwSize;
  176. m_Prog1.SetPos(dwBytes*100/m_OneLen);
  177. m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
  178. FLOAT fSpeed = 0;
  179. fSpeed = (float)dwBytes;
  180. fSpeed /= ((float)time)/1000.0f;
  181. fSpeed /= 1024.0f;
  182. end = timeGetTime();
  183. time = end - start;
  184. if(time == 0)
  185. time = 10;
  186. CString strSpeed;
  187. strSpeed.Format("%2.2f",fSpeed);
  188. m_UpList.SetItemText(uIndex,3,strSpeed);
  189. }
  190. }   // do
  191. while (TRUE);
  192. fflush (pFile);
  193. fclose (pFile);
  194. return 0;//成功
  195. }
  196. void CUpdatePage::CheckDonwloadThread()
  197. {
  198. m_bUpdate = TRUE;
  199. BOOL bNeedReset = FALSE;
  200. m_TaskLen = 0;
  201. m_UpList.DeleteAllItems();
  202. //得到系统临时目录
  203. // AddEvent(M_WARING,"获取系统临时目录...");
  204. TCHAR szTempPath[MAX_PATH] = {0}; 
  205. if (GetTempPath(MAX_PATH, szTempPath) == 0)
  206. {
  207. AddEvent(M_ERROR, MiniCT_1709);
  208. m_bUpdate = FALSE;
  209. return;
  210. }
  211. //得到临时文件名
  212. char szIniPath[256] = {0};
  213. UINT nResult = GetTempFileName (szTempPath, _T("~mc"), 0, szIniPath);
  214. AddEvent(M_WARING, MiniCT_1710); //下载版本信息...
  215. //首先解析m_sIniUrl,http -> DownHttpFile;ftp - > DownFtpFile
  216. if(_strnicmp(m_sIniUrl.GetBuffer(0), "http:", 5) == 0)//http协议
  217. {
  218. m_sIniUrl.ReleaseBuffer();
  219. if(DownHttpFile(m_sIniUrl, szIniPath, 0 ,"",FALSE))//0 成功; 1 失败
  220. {
  221. m_bUpdate = FALSE;
  222. return;
  223. }
  224. }
  225. else if(_strnicmp(m_sIniUrl.GetBuffer(0), "ftp:", 4) == 0)
  226. {
  227. m_sIniUrl.ReleaseBuffer();
  228. if(ConnectFtp("sServerName", 21, "sUserName", "sUserPwd"))
  229. {
  230. if(DownFtpFile(m_sIniUrl, szIniPath))//0 成功; 1 失败
  231. {
  232. m_bUpdate = FALSE;
  233. return;
  234. }
  235. }
  236. }
  237. AddEvent(M_WARING, MiniCT_1711); //分析版本信息...
  238. //分析版本信息
  239. char buf[255]={0};
  240. //[MiniCA]
  241. //GUID={4238FF04-E193-46e4-97A9-177238839CD2}
  242. GetPrivateProfileString("MiniCA", "GUID","",buf,50, szIniPath);
  243. if(strcmp(buf,m_sIniGuid)!=0)//版本文件错误
  244. {
  245. AddEvent(M_ERROR, MiniCT_1712);//版本信息无效!
  246. m_bUpdate = FALSE;
  247. return;
  248. }
  249. GetPrivateProfileString("TOTAL", "ToTal","1",buf,255, szIniPath);
  250. int nUpdateCount = atoi(buf);//需要更新的文件个数
  251. if(nUpdateCount == 0)
  252. {
  253. AddEvent(M_ERROR, MiniCT_1713); //版本信息中指定升级文件为0!
  254. m_bUpdate = FALSE;
  255. return;//升级文件个数为0
  256. }
  257. stuUPDATE * pStuUPDATE = new stuUPDATE[nUpdateCount];
  258. memset(pStuUPDATE,0,sizeof(stuUPDATE)*nUpdateCount);
  259. char strIndex[7];
  260. for(int i=0,j=0,nCount = 0;i<nUpdateCount;i++)
  261. {
  262. // stuUPDATE * pUPDATE = new stuUPDATE;
  263. wsprintf(strIndex,"INDEX%d",i+1);
  264. char sFileName[256] = {0}, //名称
  265. sFileUrl[256] = {0}, //网址
  266. // sPath[256] = {0},//本地路径
  267. sFileLen[256] = {0},//文件长度
  268. sFileCrc[256] = {0},//文件CRC
  269. sFilePath[256] = {0},//路径+文件名
  270. sFileDepict[256] = {0},//文件描述
  271. sFileOperate[5] = {0};//文件操作方式
  272. GetPrivateProfileString(strIndex, "FileName","",sFileName,255, szIniPath);//文件名称
  273. if(strlen(sFileName)==0)//缺少文件名称
  274. continue;
  275. GetPrivateProfileString(strIndex, "FileUrl","",sFileUrl,255, szIniPath);//网络路径
  276. if(strlen(sFileUrl)==0)//网络路径缺少
  277. continue;
  278. GetPrivateProfileString(strIndex, "FilePath","",sFilePath,255, szIniPath);//相对路径
  279. GetPrivateProfileString(strIndex, "FileLength","",sFileLen,255, szIniPath);//文件大小
  280. if(atoi(sFileLen)==0)//文件长度为0
  281. continue;
  282. GetPrivateProfileString(strIndex, "FileDepict","",sFileDepict,255, szIniPath);//文件描述
  283. GetPrivateProfileString(strIndex, "FileOperate","",sFileOperate,5, szIniPath);//文件操作方式
  284. GetPrivateProfileString(strIndex, "FileGuid","",sFileCrc,255, szIniPath);//文件CRC,比较
  285. wsprintf(buf,"%s %s ...",MiniCT_1714, sFileName); //检测版本
  286. AddEvent(M_WARING,buf);
  287. char FilePath[255] = {0};//本地文件完整路径
  288. char dir[255] = {0};
  289. wsprintf(FilePath,"%s\%s\%s",m_sExePath.GetBuffer(0),sFilePath,sFileName);
  290. unsigned char md_value[MAX_MD_SIZE] = "";
  291. unsigned int md_len;
  292. char outMsg[255] = {0};
  293. if(CEvp::Digest("md5",FilePath,0,md_value,&md_len, outMsg))//本地存在文件
  294. {
  295. if(sFileCrc == LmToHText(md_value,md_len))//文件相同,不加入队列
  296. {
  297. //检测是否注册或运行
  298. FileOperate(FilePath,sFileOperate);//文件操作
  299. continue;
  300. }
  301. }
  302. // Create a masked image list large enough to hold the icons. 
  303. //添加
  304. //向list中添加信息 stuUPDATE
  305. LVITEM lvItem;
  306. lvItem.mask = LVIF_TEXT | LVIF_IMAGE; 
  307. lvItem.state = 0; 
  308.         lvItem.iItem = i;
  309.         lvItem.iSubItem = 0;
  310.         lvItem.pszText = sFileName;
  311. lvItem.iImage = 11;// 11 - 15
  312. //设置DATA为CRC,下载完毕后检验用
  313. // lvItem.lParam = uCrc; m_PtrList
  314. m_UpList.InsertItem(&lvItem);
  315. m_UpList.SetItemText(j,1,sFileLen);
  316. m_UpList.SetItemText(j,2, MiniCT_1715);
  317. // m_UpList.SetItemText(j,3,");
  318. m_UpList.SetItemText(j,4,sFileDepict);
  319. //增加数组信息
  320. strncpy(pStuUPDATE[j].FileGuid, sFileCrc,255);
  321. pStuUPDATE[j].FileLength = atoi(sFileLen);
  322. strncpy(pStuUPDATE[j].FileName, sFileName,255);
  323. strncpy(pStuUPDATE[j].FileOperate,sFileOperate,5);
  324. strncpy(pStuUPDATE[j].FilePath,sFilePath,255);
  325. strncpy(pStuUPDATE[j].FileUrl,sFileUrl,255);
  326. //下载总长度增加
  327. j++;
  328. m_TaskLen += atoi(sFileLen);
  329. nCount++;
  330. }
  331. //下载文件
  332. if(nCount == 0)
  333. {
  334. AddEvent(M_OK, MiniCT_1716); //操作完成,没有需要升级的文件
  335. m_bUpdate = FALSE;
  336. return;
  337. }
  338. for(i=0;i<nCount;i++)
  339. {
  340. // ::SetFocus(m_hListCtrl);
  341. m_UpList.SetItemText(i,2, MiniCT_1717); //尝试中....
  342. m_UpList.EnsureVisible(i,FALSE);
  343. char dir[255] = {0};
  344. wsprintf(dir,"%s\%s\",m_sExePath.GetBuffer(0),pStuUPDATE[i].FilePath);//路径
  345. //测试路径是否存在
  346. if(!CMiniCaApp::MakeSureDirectoryPathExists(dir))
  347. {
  348. char buf[300] = {0};
  349. wsprintf(buf,"%s%s", MiniCT_1718, dir); //无法建立目录
  350. m_UpLen+= pStuUPDATE[i].FileLength;
  351. m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
  352. // m_Prog2.Invalidate();
  353. m_UpList.SetItemText(i, 2, MiniCT_1719);
  354. AddEvent(M_ERROR,buf);
  355. continue;
  356. }
  357. /* if(_mkdir(dir) == -1)
  358. {
  359. if(errno==ENOENT)//目录没有发现
  360. {
  361. char buf[300] = {0};
  362. wsprintf(buf,"无法建立目录%s",dir);
  363. m_UpLen+= pStuUPDATE[i].FileLength;
  364. m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
  365. // m_Prog2.Invalidate();
  366. m_UpList.SetItemText(i,2,"下载失败");
  367. AddEvent(M_ERROR,buf);
  368. continue;
  369. }
  370. }*/
  371. char FilePath[255] = {0};//本地文件完整路径
  372. char FilePathTemp[255] = {0};//本地文件完整路径
  373. //尝试下载文件
  374. wsprintf(FilePath,"%s%s...", MiniCT_1720, pStuUPDATE[i].FileName); //尝试下载
  375. AddEvent(M_WARING,FilePath);
  376. wsprintf(FilePath,"%s\%s\%s",m_sExePath.GetBuffer(0),pStuUPDATE[i].FilePath,
  377. pStuUPDATE[i].FileName);//最后文件
  378. wsprintf(FilePathTemp,"%s.tmp",FilePath);//保存临时文件
  379. m_OneLen = pStuUPDATE[i].FileLength;
  380. if(DownHttpFile(pStuUPDATE[i].FileUrl,FilePathTemp,i,pStuUPDATE[i].FileName) != 0)
  381. {
  382. LVITEM lvItem;
  383. lvItem.mask =  LVIF_IMAGE | LVIF_STATE; 
  384. lvItem.state = LVIS_SELECTED | LVIS_FOCUSED; 
  385. lvItem.iItem = i;
  386.     lvItem.iSubItem = 0;
  387. lvItem.iImage = 14;
  388. m_UpList.SetItem(&lvItem);
  389. m_UpList.SetItemText(i,2, MiniCT_1719);
  390. wsprintf(FilePath,"%s %s",pStuUPDATE[i].FileName, MiniCT_1719);
  391. AddEvent(M_ERROR,FilePath);
  392. m_UpLen+= pStuUPDATE[i].FileLength;
  393. m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
  394. // m_Prog2.Invalidate();
  395. continue;
  396. }
  397. else
  398. {
  399. char temp[255] = {0};
  400. unsigned char md_value[MAX_MD_SIZE]="";
  401. unsigned int md_len;
  402. char outMsg[255] = {0};
  403. wsprintf(temp,"%s%s...",MiniCT_1721, pStuUPDATE[i].FileName); //校验
  404. AddEvent(M_WARING,temp);
  405. if(CEvp::Digest("md5",FilePathTemp,0,md_value,&md_len, outMsg))//本地存在文件
  406. {
  407. if(pStuUPDATE[i].FileGuid != LmToHText(md_value,md_len))//文件相同,不加入队列
  408. {
  409. LVITEM lvItem;
  410. lvItem.mask = LVIF_IMAGE | LVIF_STATE; 
  411. lvItem.state = LVIS_SELECTED | LVIS_FOCUSED; 
  412. lvItem.iItem = i;
  413. lvItem.iSubItem = 0;
  414. lvItem.iImage = 14;
  415. m_UpList.SetItem(&lvItem);
  416. m_UpList.SetItemText(i,2, MiniCT_1722); //校验失败
  417. wsprintf(temp,"%s%s", pStuUPDATE[i].FileName, MiniCT_1722); //校验失败!
  418. AddEvent(M_ERROR,temp);
  419. m_UpLen+= pStuUPDATE[i].FileLength;
  420. m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
  421. //删除本地文件
  422. DeleteFile(FilePathTemp);
  423. continue;
  424. }
  425. }
  426. //修改文件名
  427. if(MoveFileEx(FilePathTemp,FilePath,MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING))
  428. {
  429. LVITEM lvItem;
  430. lvItem.mask = LVIF_IMAGE | LVIF_STATE; 
  431. lvItem.state = LVIS_SELECTED | LVIS_FOCUSED; 
  432. lvItem.iItem = i;
  433.     lvItem.iSubItem = 0;
  434. lvItem.iImage = 13;
  435. m_UpList.SetItem(&lvItem);
  436. m_UpList.SetItemText(i, 2, MiniCT_1723); //升级成功
  437. FileOperate(FilePath, pStuUPDATE[i].FileOperate);//文件操作
  438. wsprintf(temp,"%s%s", pStuUPDATE[i].FileName, MiniCT_1723);//升级成功
  439. AddEvent(M_OK,temp);
  440. }
  441. else
  442. {
  443. if(MoveFileEx(FilePathTemp,FilePath,MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_REPLACE_EXISTING))
  444. {
  445. LVITEM lvItem;
  446. lvItem.mask = LVIF_IMAGE | LVIF_STATE; 
  447. lvItem.state = LVIS_SELECTED | LVIS_FOCUSED; 
  448. lvItem.iItem = i;
  449. lvItem.iSubItem = 0;
  450. lvItem.iImage = 15;
  451. m_UpList.SetItem(&lvItem);
  452. m_UpList.SetItemText(i, 2, MiniCT_1724); //需要重启
  453. wsprintf(temp,"%s%s",pStuUPDATE[i].FileName, MiniCT_1725); //将在重启后更新
  454. AddEvent(M_WARING,temp);
  455. bNeedReset = TRUE;
  456. }
  457. else
  458. {
  459. GetLastError();
  460. m_UpLen+= pStuUPDATE[i].FileLength;
  461. m_Prog2.SetPos(m_UpLen*100/m_TaskLen);
  462. // m_Prog2.Invalidate();
  463. continue;
  464. }
  465. }
  466. }
  467. }
  468. delete [] pStuUPDATE;
  469. m_bUpdate = FALSE;
  470. if(m_bReset && bNeedReset)//允许重新启动
  471. {
  472. //MiniCT_1726  MiniCT_1727 
  473. if(MessageBox(MiniCT_1726, MiniCT_1727, MB_ICONQUESTION | MB_DEFBUTTON2| MB_YESNO) == IDYES)
  474. {
  475. SystemShutdown(EWX_REBOOT | EWX_FORCE, 0);
  476. }
  477. else
  478. AddEvent(M_WARING, MiniCT_1728);//系统需要重启以应用更新
  479. }
  480. else if(!m_bReset && bNeedReset)
  481. {
  482. AddEvent(M_WARING, MiniCT_1728);
  483. }
  484. }
  485. void CUpdatePage::GetLastError()
  486. {
  487. LPVOID lpMsgBuf;
  488. DWORD dErrCode = ::GetLastError();
  489. if(FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
  490. FORMAT_MESSAGE_IGNORE_INSERTS,NULL, dErrCode,
  491. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  492. (LPTSTR) &lpMsgBuf, 0,NULL ))
  493. {
  494. AddEvent(M_ERROR,(LPTSTR)lpMsgBuf);
  495. }
  496. else
  497. {
  498. char buf[256] = {0};
  499. GetErrInfo(dErrCode, buf);
  500. //wsprintf(buf,"错误代码%d",dErrCode);
  501. AddEvent(M_ERROR,buf); //ERROR_INTERNET_TIMEOUT
  502. }
  503. LocalFree( lpMsgBuf );
  504. }
  505. void CUpdatePage::AddEvent(int iState ,CString Info)
  506. {
  507. AddMsg(Info,iState);
  508. }
  509. CWinThread * ThreadUpdate = NULL; //枚举线程
  510. UINT _CheckDonwloadThread(LPVOID lparam)
  511. {
  512. CUpdatePage * p=(CUpdatePage*)lparam;
  513. p->CheckDonwloadThread();
  514. //变换图标
  515. ((CMiniMainDlg *)p->m_pParent)->SetItemIcon(MiniCT_0006, 12);
  516. return 1;
  517. }
  518. void CUpdatePage::OnBup() 
  519. {
  520. // TODO: Add your control notification handler code here
  521. if(m_bUpdate)
  522. return ;
  523. m_sExePath += "\";
  524. if(!CMiniCaApp::MakeSureDirectoryPathExists(m_sExePath))
  525. {
  526. CString str;
  527. str.Format("建立目录%s失败!",m_sExePath);
  528. AddEvent(M_ERROR,str.GetBuffer(0));
  529. return ;
  530. }
  531. /* if(_mkdir(m_sExePath) == -1)
  532. {
  533. if(errno==ENOENT)//目录没有发现
  534. {
  535. CString str;
  536. str.Format("建立目录%s失败!",m_sExePath);
  537. AddEvent(M_ERROR,str.GetBuffer(0));
  538. return ;
  539. }
  540. }*/
  541. m_TaskLen = m_UpLen = m_OneLen = 0;
  542. UINT dwthreadId = 0;
  543. //变换图标
  544. ((CMiniMainDlg *)GetParent())->SetItemIcon(MiniCT_0006, 16);
  545. ThreadUpdate = ::AfxBeginThread(_CheckDonwloadThread,this,THREAD_PRIORITY_IDLE);
  546. }
  547. BOOL CUpdatePage::SystemShutdown(UINT uFlags, DWORD dwReason)
  548. {
  549. HANDLE hToken; 
  550. TOKEN_PRIVILEGES tkp; 
  551. // Get a token for this process. 
  552. if (!OpenProcessToken(GetCurrentProcess(), 
  553.         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
  554. return( FALSE ); 
  555. // Get the LUID for the shutdown privilege. 
  556. LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
  557.         &tkp.Privileges[0].Luid); 
  558. tkp.PrivilegeCount = 1;  // one privilege to set    
  559. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
  560. // Get the shutdown privilege for this process. 
  561. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
  562.         (PTOKEN_PRIVILEGES)NULL, 0); 
  563. if (::GetLastError() != ERROR_SUCCESS) 
  564. return FALSE; 
  565. // Shut down the system and force all applications to close. 
  566. if (!ExitWindowsEx(uFlags, dwReason)) 
  567. return FALSE; 
  568. return TRUE;
  569. }
  570. BOOL CUpdatePage::RegSvr(char *DllPath, BOOL bType)
  571. {
  572. // Initialize OLE.
  573. if (FAILED(OleInitialize(NULL)))//没有此句,将导致注册失败
  574. {
  575. return FALSE;
  576. }
  577. HRESULT (STDAPICALLTYPE * lpDllEntryPoint)(void);
  578. // Load the library.
  579. HINSTANCE hLib = LoadLibraryEx(DllPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
  580. if (hLib < (HINSTANCE)HINSTANCE_ERROR) 
  581. {
  582. TCHAR szError[12];
  583. wsprintf(szError, _T("0x%08lx"), ::GetLastError());
  584. //DisplayMessage(IDS_LOADLIBFAILED, pszDllName, szError);
  585. //iReturn = FAIL_LOAD;
  586. goto CleanupOle;
  587. }
  588. // Find the entry point.
  589. if(bType)
  590. {
  591. (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib,_T("DllRegisterServer"));
  592. }
  593. else
  594. (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib,_T("DllUnregisterServer"));
  595. if (lpDllEntryPoint == NULL)
  596. {
  597. TCHAR szExt[_MAX_EXT];
  598. _tsplitpath(DllPath, NULL, NULL, NULL, szExt);
  599. /* if ((_stricmp(szExt, ".dll") != 0) && (_stricmp(szExt, ".ocx") != 0))
  600. DisplayMessage(IDS_NOTDLLOROCX, pszDllName, pszDllEntryPoint);
  601. else
  602. DisplayMessage(IDS_NOENTRYPOINT, pszDllName, pszDllEntryPoint);
  603. iReturn = FAIL_ENTRY;*/
  604. goto CleanupLibrary;
  605. }
  606. // Call the entry point.
  607. if (FAILED((*lpDllEntryPoint)()))
  608. {
  609. // DisplayMessage(IDS_CALLFAILED, pszDllEntryPoint, pszDllName);
  610. // iReturn = FAIL_REG;
  611. goto CleanupLibrary;
  612. }
  613. CleanupLibrary:
  614. FreeLibrary(hLib);
  615. CleanupOle:
  616. OleUninitialize();
  617. return TRUE;
  618. }
  619. BOOL CUpdatePage::FileOperate(char *FilePath, char *Operate)
  620. {
  621. if(_strnicmp(Operate,"Reg",4) == 0)//注册
  622. {
  623. RegSvr(FilePath);
  624. }
  625. else if(_strnicmp(Operate,"Run",4) == 0)//运行
  626. {
  627. /* PROCESS_INFORMATION pi;
  628. STARTUPINFO si;
  629. memset(&si,0,sizeof(si));
  630. si.cb = sizeof(si);
  631. si.dwX = CreateWindow();
  632. si.dwY = CreateWindow();;
  633. si.wShowWindow = SW_SHOW;
  634. si.dwFlags = STARTF_USESHOWWINDOW;
  635.   bool fRet=CreateProcess(FilePath,NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
  636. */ }
  637. else if(_strnicmp(Operate,"Open",4) == 0)//打开
  638. {
  639. ShellExecute(this->m_hWnd,"open",FilePath,"","",SW_SHOW );
  640. }
  641. return TRUE;
  642. }
  643. CString CUpdatePage::LmToHText(UCHAR * pValue, UINT uLen) //乱码转16进制
  644. {
  645. char * pBuf = new char[2*uLen+1];
  646. memset(pBuf,0,2*uLen+1);
  647. for(unsigned i=0;i<uLen;i++)
  648. {
  649. sprintf(pBuf+i*2,"%02X",pValue[i]);//02x标示1个16进制变为2个字符,空补零
  650. }
  651. CString str;
  652. str.Format("%s",pBuf);
  653. delete pBuf;
  654. return str;
  655. }
  656. CString CUpdatePage::GetFileGuid(CString strFile)
  657. {
  658. unsigned char md_value[MAX_MD_SIZE]="";
  659. unsigned int md_len;
  660. char outMsg[255] = {0};
  661. CEvp::Digest("md5",strFile.GetBuffer(0),0,md_value,&md_len, outMsg);//本地存在文件
  662. return LmToHText(md_value,md_len);
  663. }
  664. void CUpdatePage::OnRclickListctrl(NMHDR* pNMHDR, LRESULT* pResult) 
  665. {
  666. // TODO: Add your control notification handler code here
  667. /* CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  668. "所有文件(*.*)|*.*||",NULL);
  669. if(dlgOpen.DoModal()!=IDOK) return;
  670. CString strGuid = GetFileGuid(dlgOpen.GetPathName());
  671. if(OpenClipboard())
  672. {
  673. HGLOBAL clipbuffer;
  674. char * buffer;
  675. EmptyClipboard();
  676. clipbuffer = GlobalAlloc(GMEM_DDESHARE, strGuid.GetLength()+1);
  677. buffer = (char*)GlobalLock(clipbuffer);
  678. strcpy(buffer, LPCSTR(strGuid.GetBuffer(0)));
  679. GlobalUnlock(clipbuffer);
  680. SetClipboardData(CF_TEXT,clipbuffer);
  681. CloseClipboard();
  682. }*/
  683. *pResult = 0;
  684. }
  685. void CUpdatePage::AddMsg(CString info, DWORD type)
  686. {
  687. CMiniMainDlg * pMain = (CMiniMainDlg *)m_pParent;
  688. pMain->AddMsg(MiniCT_0006, info, type);
  689. }
  690. BOOL CUpdatePage::PreTranslateMessage(MSG* pMsg)
  691. {
  692. // 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.
  693. }
  694. void CUpdatePage::GetErrInfo(DWORD dError, char * tmp_msg)
  695. switch (dError)
  696. {
  697. case 12001:
  698. tmp_msg = ("Out of handles");
  699. break;
  700. case 12002:
  701. tmp_msg = ("Timeout");
  702. // error_code = FETCH_TIMEOUT;
  703. break;
  704. case 12004:
  705. tmp_msg = ("Internal Error");
  706. break;
  707. case 12005:
  708. tmp_msg = ("Invalid URL");
  709. // error_code = FETCH_BAD_URL;
  710. break;
  711. case 12007:
  712. tmp_msg = ("Service Name Not Resolved");
  713. // error_code = FETCH_CANNOT_RESOLVE;
  714. break;
  715. case 12008:
  716. tmp_msg = ("Protocol Not Found");
  717. // error_code = FETCH_BAD_URL;
  718. break;
  719. case 12013:
  720. tmp_msg = ("Incorrect User Name");
  721. // error_code = FETCH_BAD_USERNAME;
  722. break;
  723. case 12014:
  724. tmp_msg = ("Incorrect Password");
  725. // error_code = FETCH_BAD_PASSWORD;
  726. break;
  727. case 12015:
  728. tmp_msg = ("Login Failure");
  729. // error_code = FETCH_LOGIN_FAILED;
  730. break;
  731. case 12016:
  732. tmp_msg = ("Invalid Operation");
  733. break;
  734. case 12017:
  735. tmp_msg = ("Operation Canceled");
  736. break;
  737. case 12020:
  738. tmp_msg = ("Not Proxy Request");
  739. break;
  740. case 12023:
  741. tmp_msg = ("No Direct Access");
  742. break;
  743. case 12026:
  744. tmp_msg = ("Request Pending");
  745. break;
  746. case 12027:
  747. tmp_msg = ("Incorrect Format");
  748. break;
  749. case 12028:
  750. tmp_msg = ("Item not found");
  751. break;
  752. case 12029:
  753. tmp_msg = ("Cannot connect");
  754. // error_code = FETCH_CANNOT_CONNECT;
  755. break;
  756. case 12030:
  757. tmp_msg = ("Connection Aborted");
  758. // error_code = FETCH_CONNECT_ABORT;
  759. break;
  760. case 12031:
  761. tmp_msg = ("Connection Reset");
  762. // error_code = FETCH_CONNECT_RESET;
  763. break;
  764. case 12033:
  765. tmp_msg = ("Invalid Proxy Request");
  766. break;
  767. case 12034:
  768. tmp_msg = ("Need UI");
  769. break;
  770. case 12035:
  771. tmp_msg = ("Sec Cert Date Invalid");
  772. break;
  773. case 12038:
  774. tmp_msg = ("Sec Cert CN Invalid");
  775. break;
  776. case 12044:
  777. tmp_msg = ("Client Auth Cert Needed");
  778. break;
  779. case 12045:
  780. tmp_msg = ("Invalid CA Cert");
  781. break;
  782. case 12046:
  783. tmp_msg = ("Client Auth Not Setup");
  784. break;
  785. case 12150:
  786. tmp_msg = ("HTTP Header Not Found");
  787. // error_code = FETCH_BAD_HTTP;
  788. break;
  789. case 12152:
  790. tmp_msg = ("Invalid HTTP Server Response");
  791. // error_code = FETCH_BAD_HTTP;
  792. break;
  793. case 12153:
  794. tmp_msg = ("Invalid HTTP Header");
  795. // error_code = FETCH_BAD_HTTP;
  796. break;
  797. case 120154:
  798. tmp_msg = ("Invalid Query Request");
  799. // error_code = FETCH_BAD_HTTP;
  800. break;
  801. case 120156:
  802. tmp_msg = ("Redirect Failed");
  803. // error_code = FETCH_BAD_HTTP;
  804. break;
  805. case 120159:
  806. tmp_msg = ("TCP/IP not installed");
  807. break;
  808. default:
  809. tmp_msg = ("Error");
  810. // error_code = FETCH_FAILURE;
  811. }
  812. }
  813. void CALLBACK FtpCallbackStatus(HINTERNET hInternet,
  814.  DWORD dwContext,
  815.  DWORD dwInternetStatus,
  816.  LPVOID lpvStatusInformation,
  817.  DWORD dwStatusInformationLength)
  818. {
  819. // 获取上下文信息
  820. CUpdatePage::REQUEST_CONTEXT * pcFtpMsg = 
  821. reinterpret_cast<CUpdatePage::REQUEST_CONTEXT*>(dwContext);
  822. if(pcFtpMsg == NULL)
  823. {
  824.         return;
  825. }
  826. LPDWORD pdwInformation(NULL);
  827. CUpdatePage * pUpdate = (CUpdatePage *)pcFtpMsg->pUpdate;
  828. char cout[255] = {0};
  829. // 查询当前文件传输状态
  830. switch(dwInternetStatus)
  831. {
  832. case INTERNET_STATUS_RESOLVING_NAME:      // 10
  833. sprintf(cout,"Looking up the IP address for %s", (LPCTSTR)lpvStatusInformation);
  834. // sout.append(cout);
  835. // pUpdate->AddEvent(0,sout);
  836.         break;
  837. case INTERNET_STATUS_NAME_RESOLVED:        // 11
  838.   sprintf(cout,"Name resolved %s", (LPCTSTR)lpvStatusInformation);
  839. // sout.append(cout);
  840. // pUpdate->AddEvent(0,sout);
  841.         break;
  842. case INTERNET_STATUS_CONNECTING_TO_SERVER:       // 20
  843.         // lpvStatusInformation是一个SOCKADDR的指针
  844.   sprintf(cout,"Connecting to server--%s...", (LPCTSTR)lpvStatusInformation);
  845. // sout.append(cout);
  846. // pUpdate->AddEvent(0,sout);
  847.         break;
  848. case INTERNET_STATUS_CONNECTED_TO_SERVER:  // 21
  849.         // lpvStatusInformation是一个SOCKADDR的指针
  850.   sprintf(cout,"Connected to server--%s", (LPCTSTR)lpvStatusInformation);
  851. // sout.append(cout);
  852. // pUpdate->AddEvent(0,sout);
  853.         break;
  854. case INTERNET_STATUS_SENDING_REQUEST:           // 30
  855.         break;
  856. case INTERNET_STATUS_REQUEST_SENT:                  // 31
  857.         {
  858. // 发送数据到服务器
  859. if(pcFtpMsg->bBegin)
  860. {
  861. // 只有当处于上传状态的时候,才处理
  862. if(pcFtpMsg->m_dwFtpHead > 0 && pcFtpMsg->m_dwFtpHead < 6)
  863. {
  864. // 5这个值是一个经验值,具体为什么,由于没有深入研究rfc的协议
  865. // 所以还不知道,将来如果知道原因,可以补充上
  866. pcFtpMsg->m_dwFtpHead ++;
  867. }
  868. pdwInformation = (LPDWORD)lpvStatusInformation;
  869. if(pcFtpMsg->m_dwFtpHead == 6)
  870. {
  871. pcFtpMsg->dFinishLen += *pdwInformation;
  872. pcFtpMsg->dTotalFinish += *pdwInformation;
  873. // ATLTRACE("本次发送的数据大小为: %d,总共数据为:%dn", *pdwInformation,
  874. // pcFtpMsg->dFileLen);
  875. if(pcFtpMsg->hWindow != NULL)
  876. {
  877. // 首先的第一选择是给窗口发送消息
  878. // SendDlgItemMessage(pcFtpMsg->hWindow,IDC_PROGRESS_ONE,PBM_SETPOS,
  879. // (pcFtpMsg->dFinishLen*100.0/pcFtpMsg->dFileLen),0);
  880. // SendDlgItemMessage(pcFtpMsg->hWindow,IDC_PROGRESS_TOTAL,PBM_SETPOS,
  881. // (pcFtpMsg->dTotalFinish*100.0/pcFtpMsg->dTotalLen),0);
  882. }
  883. }// End if 5,经验值
  884. }// end if 文件上传
  885.         }
  886.         break;
  887. case INTERNET_STATUS_RESPONSE_RECEIVED:        // 41
  888.         {
  889. // 从服务器接收到的响应
  890. if(pcFtpMsg->bBegin)
  891. {
  892. // 只有当处于下载状态的时候,才处理
  893. pdwInformation = (LPDWORD)lpvStatusInformation;
  894. if(pcFtpMsg->m_dwFtpHead > 0 && pcFtpMsg->m_dwFtpHead < 6)
  895. {
  896. // 6这个值是一个经验值,具体为什么,由于没有深入研究rfc的协议
  897. // 所以还不知道,将来如果知道原因,可以补充上
  898. pcFtpMsg->m_dwFtpHead ++;
  899. //  ATLTRACE("在连接之后第%d次接收数据!n", pcFtpMsg->m_dwFtpHead);
  900. }
  901. if(pcFtpMsg->m_dwFtpHead == 6)
  902. {
  903. pcFtpMsg->dFinishLen += *pdwInformation;
  904. pcFtpMsg->dTotalFinish += *pdwInformation;
  905. // ATLTRACE("本次发送的数据大小为: %d,总共数据为:%dn", *pdwInformation,
  906. // pcFtpMsg->dFileLen);
  907. if(pcFtpMsg->hWindow != NULL)
  908. {
  909. // 首先的第一选择是给窗口发送消息
  910. // SendDlgItemMessage(pcFtpMsg->hWindow,IDC_PROGRESS_ONE,PBM_SETPOS,
  911. // (pcFtpMsg->dFinishLen*100.0/pcFtpMsg->dFileLen),0);
  912. // SendDlgItemMessage(pcFtpMsg->hWindow,IDC_PROGRESS_TOTAL,PBM_SETPOS,
  913. // (pcFtpMsg->dTotalFinish*100.0/pcFtpMsg->dTotalLen),0);
  914. }
  915. }// End if 6,经验值
  916. }// End if 文件下载
  917.         }
  918.         break;
  919. case INTERNET_STATUS_RECEIVING_RESPONSE:             // 40
  920.         // 等待服务器的响应,lpvStatusInformation = NULL
  921.         break;
  922. case INTERNET_STATUS_CTL_RESPONSE_RECEIVED:              // 42
  923. case INTERNET_STATUS_PREFETCH:                                 // 43
  924. case INTERNET_STATUS_CLOSING_CONNECTION:           // 50
  925.   sprintf(cout,"Closing connection");
  926. // sout.append(cout);
  927. // pUpdate->AddEvent(0,sout);
  928.         break;
  929. case INTERNET_STATUS_CONNECTION_CLOSED:                    // 51
  930.   sprintf(cout,"Connection closed");
  931. // sout.append(cout);
  932. // pUpdate->AddEvent(0,sout);
  933.         break;
  934. case INTERNET_STATUS_HANDLE_CREATED:                    // 60
  935.         {
  936. LPINTERNET_ASYNC_RESULT ptIAR =
  937. reinterpret_cast<LPINTERNET_ASYNC_RESULT>(lpvStatusInformation);
  938. // if(hInternet == pcFtpMsg->GetCurrentConnect())
  939. {
  940. // ATLTRACE("Connect Handle Created!n");
  941. pcFtpMsg->m_dwFtpHead = 1;
  942. }
  943. // else if(hInternet == pcFtpMsg->GetCurrentSession())
  944. {
  945. // ATLTRACE("Session handle created!n");
  946. }
  947.         }
  948.         break;
  949. case INTERNET_STATUS_HANDLE_CLOSING:                    // 70
  950.         pcFtpMsg->m_dwFtpHead = 0;
  951.    //     ATLTRACE("Handle closed with dif %d!n",
  952. // pcFtpMsg->GetCurrentFtpSize() - pcFtpMsg->GetTotalFileSize());
  953.         break;
  954. case INTERNET_STATUS_DETECTING_PROXY:                  // 80
  955. //       ATLTRACE("Detecting proxyn");
  956.         break;
  957. case INTERNET_STATUS_REQUEST_COMPLETE:               // 100
  958.         // 一个异步操作已经完成,lpvStatusInformation是INTERNET_ASYNC_RESULT的指针
  959.         {
  960. LPINTERNET_ASYNC_RESULT ptIAR =
  961. reinterpret_cast<LPINTERNET_ASYNC_RESULT>(lpvStatusInformation);
  962. // ATLTRACE("一个异步操作完成,错误为:%d,结果为:%dn",
  963. // ptIAR->dwError, ptIAR->dwResult);
  964.         }
  965.         break;
  966. case INTERNET_STATUS_REDIRECT:                                  // 110
  967.  //       ATLTRACE("HTTP request redirected to n");
  968.         break;
  969. case INTERNET_STATUS_INTERMEDIATE_RESPONSE:             // 120
  970.    //     ATLTRACE("Received intermediate status message from the server.n");
  971.         break;
  972. case INTERNET_STATUS_STATE_CHANGE:                         // 200
  973. //        ATLTRACE("'Moved between a secure and a nonsecure siten");
  974.         {
  975. LPDWORD pdwRead = (LPDWORD)lpvStatusInformation;
  976. switch(*pdwRead)
  977. {
  978. case INTERNET_STATE_CONNECTED:                  // 0x00000001
  979. // ATLTRACE("Connected state moved between secure and nonsecure siten");
  980. break;
  981. case INTERNET_STATE_DISCONNECTED:            // 0x00000002
  982. // ATLTRACE("Disconnected from networkn");
  983. break;
  984. case INTERNET_STATE_DISCONNECTED_BY_USER:   // 0x00000010
  985. // ATLTRACE("Disconnected by user requestn");
  986. break;
  987. case INTERNET_STATE_IDLE:                        // 0x00000100
  988. // ATLTRACE("No network requests are being made (by Wininet).n");
  989. break;
  990. case INTERNET_STATE_BUSY:                       // 0x00000200
  991. // ATLTRACE("Network requests are being made (by Wininet).n");
  992. break;
  993. case INTERNET_STATUS_USER_INPUT_REQUIRED:    // 0x00000040
  994. // ATLTRACE("The request requires user input to completen");
  995. break;
  996. default:
  997. break;
  998. }
  999.         }
  1000.         break;
  1001. default:
  1002.         break;
  1003. }// End Ftp_CallbackStatus
  1004. }
  1005. //连接服务器
  1006. BOOL CUpdatePage::ConnectFtp(CString sServerName,UINT uServerPort,
  1007. CString sUserName,CString sUserPwd)
  1008. {
  1009. char buf[256] = {0};
  1010. try
  1011. {
  1012. m_hSession = InternetOpen( _T("Ftp_Ctrl"),
  1013. INTERNET_OPEN_TYPE_DIRECT,
  1014. "",
  1015. "",
  1016. INTERNET_FLAG_NO_CACHE_WRITE);
  1017. if(!m_hSession)
  1018. {
  1019. // GetLastError(buf);
  1020. return FALSE;
  1021. }
  1022. /* if(InternetSetStatusCallback(m_hSession, FtpCallbackStatus) ==
  1023. INTERNET_INVALID_STATUS_CALLBACK)
  1024. {
  1025. InternetCloseHandle(m_hSession);
  1026. GetLastError(buf);
  1027. AddEvent(-1,buf);
  1028. return FALSE;
  1029. }*/
  1030. m_hConnect = InternetConnect(m_hSession,
  1031. sServerName,
  1032. uServerPort,
  1033. sUserName,
  1034. sUserPwd,
  1035. INTERNET_SERVICE_FTP,
  1036. INTERNET_FLAG_PASSIVE |
  1037. INTERNET_FLAG_EXISTING_CONNECT,
  1038. (DWORD)&m_Request);
  1039. if(!m_hConnect)
  1040. {
  1041. // GetLastError(buf);
  1042. // AddEvent(-1,buf);
  1043. return FALSE;
  1044. }
  1045. }
  1046. catch(...)
  1047. {
  1048. // GetLastError(buf);
  1049. // AddEvent(-1,buf);
  1050. return FALSE;
  1051. }
  1052. return TRUE;
  1053. }
  1054. BOOL CUpdatePage::DownFtpFile(LPCTSTR lpszNewRemoteFile,LPCTSTR lpszLocalFile)
  1055. {
  1056. BOOL bResult = FtpGetFile(m_hConnect,lpszNewRemoteFile,lpszLocalFile,FALSE,
  1057. FILE_ATTRIBUTE_NORMAL,FTP_TRANSFER_TYPE_BINARY,(DWORD)&m_Request);//上传
  1058. if(!bResult)
  1059. {
  1060. char buf[256] = {0};
  1061. // GetLastError(buf);
  1062. }
  1063. return bResult;
  1064. }
  1065. void CUpdatePage::DisFtpConnect()
  1066. {
  1067. // TODO: Add your implementation code here
  1068. if(m_hSession)
  1069. {
  1070. InternetCloseHandle(m_hSession);
  1071. m_hSession = NULL;
  1072. }
  1073. if(m_hConnect)
  1074. {
  1075. InternetCloseHandle(m_hConnect);
  1076. m_hConnect = NULL;
  1077. }
  1078. }
  1079. void CUpdatePage::TranslateCT()
  1080. {
  1081. CHeaderCtrl * pHeader = m_UpList.GetHeaderCtrl();
  1082. if (pHeader)
  1083. {
  1084. CString str = MiniCT_1700;
  1085. HDITEM hdi;
  1086. hdi.mask = HDI_TEXT;
  1087. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  1088. pHeader->SetItem(0, &hdi);
  1089. str = MiniCT_1701;
  1090. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  1091. pHeader->SetItem(1, &hdi);
  1092. str = MiniCT_1702;
  1093. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  1094. pHeader->SetItem(2, &hdi);
  1095. str = MiniCT_1703;
  1096. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  1097. pHeader->SetItem(3, &hdi);
  1098. str = MiniCT_1704;
  1099. hdi.pszText = (LPTSTR)((LPCTSTR)str);
  1100. pHeader->SetItem(4, &hdi);
  1101. }
  1102. }