您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:229 来源:vckbase.com

本文章共2599字,分2页,当前第1页,快速翻页:
 

使用 Http 在线自动升级程序


作者:余延斌


下载源代码
逆风编程精品


开发背景
近几日一些程序老要修改点小毛病,为避免每次都通知程序使用者,便有想做一个在线自动升级的程序。在VCKBase看到一个是使用 FTP 的,想到 FTP 需要用户名密码,许多程序如KFW 防火墙都能监看到程序发送的数据包,为防止密码泄露,故自己选用Http来做更新。我的思路是用命令行传递程序名称、版本号和 Update.ini 配置文件的 URL。命令行用法如下:

	update.exe 程序名 版本 版本文件URL

例如:

	update.exe VolleyMail 3.0 http://www.extice.com/update/update.ini
解析命令行参数的函数原型如下:
       CUpdateApp::GetCmdLinePara(CStringArray ¶Arr);
该函数是将命令行参数分解并保存到 paraArr 数据中。然后将命令行信息传递给主对话框类,代码如下:
       dlg.m_strSoft = arr.GetAt(0);

       dlg.m_strVersion = arr.GetAt(1);

       AfxParseURL( arr.GetAt(2),

                    dwType,

                    dlg.m_strServer,

                    dlg.m_strIniPath,

                    dlg.m_dwPort);

      
这是对话框的初始化,将软件版本号显示在 List 框中,如图一:
       m_cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,5);

       m_pHttp=m_cis.GetHttpConnection( m_strServer,m_dwPort );

       m_lbProduct.AddString(m_strSoft " " m_strVersion);  

图一

然后是查找可用的更新,先通过 ChttpFile 将 Update.INI 文件下载到系统临时目录下,然后调用 GetPrivateProfileString 读取网上最新的版本号以及要更新的文件,判断是否需要更新,部分代码:
      csf.Open( m_strTempDir "\\update.ini",

                CFile::modeCreate|CFile::modeWrite|CFile::typeBinary );



       char buf[2048];

       int n;

       while( ( n=pFile->Read( buf,2048 ) ) > 0 )

                     csf.Write(buf,n);





       char buf[128];

       ::GetPrivateProfileString( m_strSoft,

                                  "VERSION",

                                  "1.0",

                                  buf,

                                  sizeof(buf),

                                  m_strTempDir "\\update.ini");

       m_strNewVer=buf;

       if(atof( m_strVersion ) >= atof( buf ) ) //现有版本大于

       {

              m_strStatus = "您现在用的版本已是最新的!";

              UpdateData(FALSE);

              m_buOK.EnableWindow(FALSE);

              return;

       }        
更新部分代码
先通过 CUpdateDlg::FindAppProcessID() 看要更新的程序是否在运行:
       DWORD CUpdateDlg::FindAppProcessID()

       {

	   HANDLE handle=::CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);

    	   PROCESSENTRY32 Info;

	   Info.dwSize = sizeof(PROCESSENTRY32);

	   if(::Process32First(handle,&Info))

	   {

                do{

                     CString ss=Info.szExeFile;

                     if(!ss.CompareNoCase(m_strSoft ".exe"))

                     {

                            ::CloseHandle(handle);

                            return Info.th32ProcessID;

                      }

	          }

	          while(::Process32Next(handle,&Info)); 

    	          ::CloseHandle(handle);

	   }

    	   return -1;

       }   
 
本文章更多内容1 - 2 - 下一页>>
相关文章

《系统飞狐》中获取系统信息的方法
发掘 C# 特性赋予科学计算项目以威力
定制调试诊断工具和实用程序——摆脱DLL“地
软件开发专业相关的英文简历及其资源
VC 6.0 中如何使用 CRT 调试功能来检测内
完美实现真彩自绘菜单
控件如何传递自定义struct
文件系统识别器
用 ATL ActiveX 绘制任意平面函数的曲线
软件框架的利器、TangramMini组件应用教程四
UTF-8与GB2312之间的互换
在VC中调用DirectShow全屏播放视频
案例研究:If-Trader 订单流程处理系统
介绍一个操作DHTML表格的C 对象
在非MFC程序中引用CString
简单PID数字控制的VC程序实现
论软件接口中几种底层通讯的实现
清理VC工程
VC.NET简单实现GIF动画
MFC Activex 录音机控件

相关评论


本文章所属分类:首页 VC++

  热门关键字: