浅议Delphi程序如何实现自动升级

来源 :电脑知识与技术·学术交流 | 被引量 : 0次 | 上传用户:dingxiaoyun
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:用C/S结构开发的网络软件,要解决的主要问题之一就是客户端的自动升级,只有完成了这一功能,才能使开发的网络软件能及时更新与完善。在Delphi中,通过对比当前版本和最新版本的客户端程序的修改时间来决定是否升级客户端,利用Delphi的TIdTCPClient,TIdUDPServer,TIdTCPServer,TIdUDPClient等网络通讯控件来完成客户端程序的的传输与升级。
  关键词:自动升级;基本原理;客户端;服务器
  中图分类号:TP311文献标识码:A 文章编号:1009-3044(2008)09-11662-04
  
  How Discusses the Delphi Procedure to Realize the Automatic Promotion Shallowly
  FU Xin-juan
  (Victory petroleum administrative bureau victory hospital informationcenter microcomputer room,Dongying 257055 China)
  Abstract: With the C/S structure development’s network software, one which of subject matters must solve is the client side automatic promotion, only then has completed this function, can enable the development the network software to renew and the consummation promptly. In Delphi, through the contrast current edition and the newest edition’s client side procedure’s revision time decided whether to promote the client side, uses Delphi TIdTCPClient, TIdUDPServer, TIdTCPServer, network communications and so on TIdUDPClient controls completes the client side procedure the transmission and the promotion.
  Key words: Automatic promotion; Basic principle; Client side; Server
  
  1 引言
  
  现在的许多网络软件都实现了自动升级功能,从各种杀毒软件,到QQ、UC这样的即时通讯软件,都有这方面的功能。这一功能的实现可以使程序不用人工干预,自动完成程序的升级与更新。在开发网上办公系统的过程中,由于采用C/S结构,客户端经常需要更新,通过对这些网络软件的分析,掌握了软件自动升级的基本原理,在Delphi中轻松得以实现。
  
  2 实现的基本原理
  
  自动升级的实现需要由客户端和服务器两部分来完成,客户端在启动时,先判断本地升级目录中的客户端程序的修改时间是否和正在运行的客户端程序的修改时间一致,如果不一致,就运行升级程序完成升级。客户端运行后定时检测服务器,如果有新程序,就下载到本地升级目录中,等待下次启动时完成升级。
  
  3 具体的实现方法
  
  客户端在运行后,就动态检测服务器端应用程序的发布情况,一发现有新的客户端程序发布,就及时下载升级。
  3.1 客户端的实现代码
  (1)在Delphi中新建客户应用程序,在其工程文件中判断当前程序是否和升级目录程序的修改时间一致,若是不一致,就运行客户端升级程序upgrade.exe。
  msgclient.dpr中的核心代码:
  program msgclient;
  uses
  ……
  {$R *.RES}
  Var
  upfilename,newfilename,filename:string;
  upfiletime,newfiletime:integer;
  begin
  ……
  //如果升级目录upgrade中有最新版本的客户端程序,则启动软件升级程序upgrade.exe,并退出。
  upfiletime :=0;
  newfiletime :=0;
  upfilename:=ExtractFilePath(paramstr(0)) ’upgrade\netoffice.exe’ ;
  newfilename:=ExtractFilePath(paramstr(0)) ’netoffice.exe’;
  if fileexists(upfilename) then
  upfiletime:=fileage(upfilename);
  newfiletime:=fileage(newfilename);
  filename:=ExtractFilePath(paramstr(0)) ’upgrade.exe’;
  if (upfiletime<>newfiletime) and (upfiletime<>0) then
  begin
  winexec(pchar(filename),SW_SHOWNORMAL);
  exit;
  end;
  ……
  end.
  (2)新建应用,命名为upgrade,用于升级本地客户端程序,在工程文件upgrade.dpr中用函数FindWindow(nil,’NetOffice_Fxj’)获得客户端程序的主窗口句柄,再判断升级目录中是否有升级后的客户端软件,若存在就用函数SendMessage(WsbgHWnd,WM_CLOSE,0,0)关闭客户端程序,用函数copyfile(pchar(upfilename),pchar(newfilename),False)把升级目录中客户端程序复制到当前目录并运行。
  关键代码:
  program upgrade;
  uses
  ……
  {$R *.RES}
  Var
  WsbgHWnd : HWnd;
   upfilename,newfilename:string;
  begin
  //获得当前客户端程序的文件句柄。
   WsbgHWnd := FindWindow(nil,’NetOffice_Fxj’);
   upfilename:=ExtractFilePath(paramstr(0)) ’upgrade\netoffice.exe’ ;
   newfilename:=ExtractFilePath(paramstr(0)) ’netoffice.exe’;
   if fileexists(upfilename) then
  begin
   if WsbgHWnd <>0 then
  begin
   SendMessage(WsbgHWnd ,WM_CLOSE,0,0);
  end;
   deletefile(newfilename);
   Application.MessageBox(’系统已更新。’,’信息’,MB_OK MB_ICONINFORMATION);
   copyfile(pchar(upfilename),pchar(newfilename),False);
   WinExec(pchar(newfilename),SW_SHOWNORMAL);
   exit;
  end;
   application.Terminate;
   Application.Initialize;
   Application.Run;
  end.
  (3)客户端软件在启动时向服务器端发送升级检测命令,及本地客户端的修改时间,服务器端在收到信息后和服务器端升级目录中的客户端程序的修改时间作对比,若不一致,就发送升级后的客户端程序。
  在客户端程序的主窗体中加入TIdTCPServer控件和TIdUDPServer控件。在TIdUDPServer控件的OnUDPRead事件中加入如下代码,用全局变量upgradetime获得升级后客户端程序的修改时间。
  {rec:TString变量,接收服务器发送的信息。}
  if rec.Values[’cmd’]=’upgrade’ then
  begin
  upgradetime:=strtoint(rec.Values[’upfiletime’]);
  end;
  在TIdTCPServer控件的OnExecute事件中加入如下代码,用于接收服务器端发送的最新版本的客户端程序:
  procedure TFrm_main.TCPServerExecute(AThread: TIdPeerThread);
  var
  MYFStream:TFileStream;
   filename,ssr:string;
   newfile:integer;
   sr: TSearchRec;
  begin
  //接收服务器端发来的信息。
  filename:=AThread.Connection.ReadLn;
  if filename<>’’ then
  begin
   filename:=extractfilepath(paramstr(0)) filename;
   ssr:=extractfilepath(filename);
   StrLCopy(Pchar(ssr),pchar(ssr),Length(ssr)-1);
  if FindFirst(ssr, faDirectory, sr) <>0 then
  MkDir (extractfilepath(filename));
  MyFStream := TFileStream.Create(filename, fmCreate);
  Try
  AThread.Connection.ReadStream(MyFStream,-1,True);
  finally
  AThread.Connection.Disconnect;
  MYFStream.Free;
  FindClose(sr);
  end;
  if upgradetime<>0 then
  begin
  newfile:=FileOpen(filename,fmOpenWrite);
  FileSetDate(newfile,upgradetime);
  FileClose(newfile);
  upgradetime:=0;
  end;
  end;
  end;
  3.2 服务器端的实现代码
  服务器端在收到客户端发送的升级检测命令及客户端程序的修改时间后,把收到的客户端程序的修改时间和服务器端升级目录中的修改时间作对比,如果不一致,就把升级目录中的客户端程序发送到客户端。
  在服务器的主窗体中加入TIdTCPClient控件和TIdUDPServer控件,在TIdUDPServer控件的OnUDPRead事件中加入如下代码完成这一功能。
  { rec:TString变量,接收客户端发送的信息,若接收到的信息为“upgrade”,则执行升级代码。}
  if rec.Values[’cmd’]=’upgrade’ then
  begin
  //服务器端的升级目录中有最新版的客户端程序时,把它发送到客户端。
  if FileExists(ExtractFilePath(paramstr(0)) ’upgrade\netoffice.exe’) then
  begin
   newfiletime:=FileAge(ExtractFilePath(paramstr(0)) ’upgrade\netoffice.exe’);
  if inttostr(newfiletime)<>rec.Values[’upfiletime’] then
  begin
   newfilename:=’upgrade\netoffice.exe’;
   TCPClient.Host:=ABinding.PeerIP;
  Try
   TCPClient.Connect;
   TCPClient.Writeln(newfilename);
   newfilename:=extractfilepath(paramstr(0)) newfilename;
   Fm := TfileStream.Create(newfilename,fmsharedenywrite);
   TCPClient.OpenWriteBuffer;
   TCPClient.WriteStream(Fm);
   TCPClient.CloseWriteBuffer;
  Finally
   TCPClient.Disconnect;
   Fm.Free;
  End;
  rec.Values[’upfiletime’]:=inttostr(newfiletime);
  TmpStr := rec.text;
   Binding.SendTo(ABinding.PeerIP,RemoteUDPport,TmpStr[1],length(TmpStr));
  end;
  end;
  end;
  
  4 结束语
  
  这里只简单介绍了完成软件自动升级的基本方法和实现的核心代码,在自己的软件中可以进行扩充和完善。只要细心研究,许多商业软件能完成的功能,也能在自己开发的软件中实现。
  
  参考文献:
  [1] 肖建.Delphi 6编程基础[M].北京:清华大学出版社,2001.
  [2] 曹智威.Delphi6实用编程技术[M]. 北京: 水利水电出版社,2002.
  [3] 黄建华.Delphi程序设计[M].清华大学出版社,北京,1997.
其他文献
摘要:本文在介绍WEB服务概述的基础上,提出了基于WEB服务的企业内部应用集成框架,并把该框架成功的应用到一具体的跨国集团公司的集成项目中,并取得了较好的效果。  关键词:WEB服务;系统集成;系统架构  中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)08-10ppp-0c    1 WEB服务概述    1.1 WEB服务的定义  “Web服务是一种新的Web应用程
由童之侠著、中国传媒大学出版社出版的《当代应用语言学》一书详细阐释了语言的本质、语言学的研究范围和应用语言学的发展过程,旨在帮助读者全面了解应用语言学及其当代价值。全书分为四大部分,包括语言、语言学和应用语言学概述;狭义的应用语言学、广义的应用语言学及应用语言学的跨学科研究等。本书内容系统全面,层次清晰,知识点丰富。本书还从宏观上对当代的语言教学进行了重新审视與探究。从语言的应用角度来看,《当代应
摘要:本文对于在使用photoshop中经常遇到的一些问题进行了分析,提出了相应的解决方法。  关键词:photoshop;常见问题;解决方法  中图分类号:TP3文献标识码:A文章编号:1009-3044(2008)21-30542-02    Photoshop Application of Common Problems and Solutions  YUAN Mei-xiong  (Hun
摘要:该文分析了网络操作系统(NOS)的教学和实验现状,指出现有教学实验条件存在的问题,给出了一种基于虚拟机技术的NOS实验训室的建设方案,用于解决网络操作系统课程的实践教学问题。  关键词:虚拟机;NOS;实训室  中图分类号:TP391文献标识码:A文章编号:1009-3044(2008)36-2957-01  The NOS Training Room Building Based on V
摘要:这篇文章结合了作者多年的实践教学经验,指出了目前教学方面存在的问题,并有针对性地从教学模式、教学方法等多个方面探讨了JAVA程序设计的课程教学改革。文中对教学的各个环节提出了新的建议并且经实践新的方式能提高学生的编程能力、自学能力、沟通能力和团队合作能力。  关键词:JAVA; 教学模式; 教学方法; 教学改革  中图分类号:G642文献标识码:A文章编号:1009-3044(2008)36
一  前段时间,福州八岁小学生冯某上了热搜,原因是他质疑统编教材二年级下册课文《羿射九日》有错误:前一段说“江河里的水被蒸干了”,接下来一段又说“他蹚过九十九条大河,来到东海边”。他指出:“既然晒干了,那后羿是怎么膛的?是不是课文出现了错误?”这一质疑引起了广大网友的关注,并迅速成为各大新闻媒体的热点话题。网友纷纷感慨“现在的小学生可不会轻易被糊弄”,并认为“一个八岁的小孩就敢质疑权威,发出自己的
摘要:AJAX是Web应用的一种新方法,使用AJAX可以强化网站的功能,提高用户体验。本文介绍了ASP.NET AJAX 的功能结构,并以显示服务器的进程信息的Web页面设计为例,展示了ASP.NET AJAX 在Web网页设计中的应用。  关键词:ASP.NET;AJAX;进程;Web网页  中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)21-30462-03   
摘要:分析了P2P技术和IPTV技术的发展现状和各自特点,研究IPTV在P2P模式下的应用,同时展望了IPTV在新的模式下的发展思路和前景。  关键词:网络电视;P2P;流媒体  中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)21-30412-03    Study on the IPTV Based on the P2P Technology  XU Yue-fei
摘要:介绍了Web数据挖掘的含义,重点讨论了Web数据挖掘的类型以各种类型的Web数据挖掘的基本过程以及它们所使用的一些相关技术,最后指出网络信息挖掘的应用前景。  关键词:Web数据挖掘;XML;JAVA  中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)09-11573-03    The Application of Data Mining Based on We
摘要:电子杂志集合了文字、图片、音频、视频和Flash动画等多种媒体元素,已成为一种新型的教育教学传播媒体,可应用于多媒体课件制作和学生活动成果展示,有利于提高教学的效率和质量。  关键词:电子杂志;多媒体;互动  中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)21-30489-02    The Application of Electronic Magazine