龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VB开发 >

用VB实现应用程序在局域网络上自动更新

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
我们在用VB开发大型应用程序时遇到如下问题,进入调试、维护阶段开发小组进驻用户单位,软件交用户试用会经常修改程序并重新编译。然后再由程序员给用户复制更新,或者通知用户
我们在用VB开发大型应用程序时遇到如下问题,进入调试、维护阶段开发小组进驻用户单位,软件交用户试用会经常修改程序并重新编译。然后再由程序员给用户复制更新,或者通知用户自行复制更新。对于少量用户可以做到及时更新。而我们的一个用户在一座十层的大厦中办公,有十几个部门(即有管理部门又有生产车间分布在不同的楼层),每个部门少则有2~3台工作站,多则有数十台工作站,与四台服务器组成局域网络.且每个部门应用程序各不相同,应用程序修改编译后经常不能同步更新,从而造成部门内数据或者部门间的数据不一致。程序员每天都要跑上跑下检查版本更新程序浪费了很多宝贵时间,即使通知部门主管自行更新,某些工作站也会出现遗漏现象。鉴于以上问题我们考虑使用程序自动更新技术,即自动检查新版本,将新版本复制到本地,重新执行本地应用程序。
  基本原理:在某个服务器上共享出一个目录,其权限为程序员完全控制,其它用户只读。
  例如:NtServer01Refresh,程序员重新编译后的应用程序.EXE都存放在此目录下。
  在应用程序的入口处调用版本检查及更新过程,如果服务器应用程序的修改时间大于本地应用程序的修改时间,则认为有新版本出现,应该将服务器上的新版本复制到本地硬盘。
  由于应用程序在运行时不能被新版本覆盖,所以就需要中介程序FastCopy.EXE(也用VB编写)来完成更新版本并重新运行本地应用程序。为了达到及时更新的目的可在应用程序中每隔5分钟或10分钟检查一次是否有新版本。(此部分略有兴趣的读者可自行编程添加)
  本例中:
  服务器:NtServer01共享目录:Refresh
  应用程序:MyApp.exe中介程序FastCopy.exe(都存储于共享目录中)
  下载源代码(6K)

具体程序实现如下:
  在应用程序工程MyApp中的部分代码如下:
  OptionExplicit
  '编译后的应用程序名称,注意没有后缀.EXE,本例为MYAPP
  PrivateConstApp_Name="MyApp"
  '最新的应用程序存放的路径,本例为:服务器NtServer01共享目录Refresh
  PrivateConstExePath="NtServer01Refresh"
  '中介程序名称,注意没有后缀.EXE,本例为FastCopy
  PrivateConstMidExeName="FastCopy"
  
  '应用程序入口
  PrivateSubForm_Load()
  IfUCase(Trim(App.EXEName))<>UCase(Trim(App_Name))Then
  MsgBox"必须将订单管理系统的名称更改为:" App_Name
  End
  EndIf
  '判断是否有最新版本的应用程序,如有则自动更新
  CallExeRefresh
  
  '下面为订单管理系统的正常操作略.......
  EndSub
  
  '版本检查及更新过程
  PrivateSubExeRefresh()
  '定义四个临时字符串变量
  Dims1AsString
  Dims2AsString
  Dims3AsString
  Dims4AsString
  OnErrorResumeNext
  '将本地应用程序MyApp.EXE的全路径名存入s1
  '将本地中介程序FastCopy.exe的全路径名存入s3
  s1="TNT"
  IfLen(App.Path)>3Then
  s1=App.Path "" Trim(App_Name) ".exe"
  s3=App.Path "" MidExeName ".EXE"
  Else
  s1=App.Path Trim(App_Name) ".exe"
  s3=App.Path MidExeName ".EXE"
  EndIf
  
  s4="TNT"
  '将本地应用程序MyApp.EXE文件的修改时间存入s4
  s4=FileDateTime(s1)
  s2="TNT"
  '将网络上应用程序MyApp.EXE文件的修改时间存入s2
  s2=FileDateTime(ExePath App_Name ".EXE")
  Ifs2="TNT"Then
  MsgBox"没有找到最新的可执行文件:" ExePath App_Name ".EXE"_
   vbCrLf vbCrLf "原因1:存放最新EXE的服务器或者工作站没有打开;"_
   vbCrLf "原因2:存放最新EXE的路径错误或者EXE文件不存在;"_
   vbCrLf "请将此情况通知程序员." vbCrLf vbCrLf_
   vbCrLf "按确定按钮后,将继续运行本地EXE文件.",vbCritical,"提示"
  EndIf
  Ifs2="TNT"Ors4="TNT"ThenExitSub
  '如果网络上应用程序MyApp.EXE文件的修改时间,大于本地MyApp.EXE文件的修改时间
  '然后再运行本地MyApp.EXE,中介程序退出后,整个更新过程结束.
  IfCDate(s2)>CDate(s4)Then
  '将网络上的中介程序FastCopy.exe复制到本地,这样可防止本地无中介程序时无法进行更新
  FileCopyExePath MidExeName ".EXE",s3
  '则运行中介程序FastCopy.exe,将最新的MyApp.EXE复制到本地
  s1=Shell(s3 "" ExePath "," App_Name ".EXE",vbNormalFocus)
  '本地应用程序MyApp.EXE终止运行,否则已经更新的MyApp.EXE无法覆盖本地的MyApp.EXE.
  End
  EndIf
  EndSub
  将以上程序编译为:MyApp.exe存储在共享目录中.
  
  在中介程序工程FastCopy中的代码如下:
  向工程中增加一个窗体Form1,向Form1中添加一个定时器Timer1,增加一个标签控件Label1,其Caption为"应用程序正在更新",并调整窗体大小.
  OptionExplicit
  PrivatesPathAsString'用于存储服务器上的共享目录
  PrivatesNameAsString'用于存储应用程序名
  PrivateSubForm_Load()
  DimsAsString
  '从应用程序的命令行参数中取得数据
  s=Trim(Command())
  DimpAsInteger
  p=InStr(1,s,",")
  Ifp>0Then
  '取得储服务器上的共享目录
  sPath=Mid(s,1,p-1)
  '取得应用程序名
  sName=Mid(s,p 1,Len(s)-p)
  '定时器延时6秒,保证本地旧版应用程序退出运行
  Timer1.Interval=6000
  Else
  '参数错误则退出
  MsgBox"Error",vbCritical,""
  UnloadMe
  End
  EndIf
  EndSub

'定时器代码
  PrivateSubTimer1_Timer()
  Timer1.Interval=0
  Dims1AsString
  '取得应用程序的本地路径
  IfLen(App.Path)>3Then
  s1=App.Path "" sName
  Else
  s1=App.Path sName
  EndIf
  '保证服务器关机或者路径错误仍可运行旧版本
  OnErrorResumeNext
  '将服务器共享目录中的最新版本复制到本地
  FileCopysPath sName,s1
  DimaAsLong
  '执行本地的应用程序
  a=Shell(s1,vbNormalFocus)
  '中介程序退出运行,应用程序自动更新结束
  UnloadForm1
  End
  EndSub
  将工程FastCopy编译为FastCopy.exe并存储于服务器的共享目录。
  
  测试:
  1、将服务器共享目录中的:MyApp.exe复制到本地硬盘的某个目录中;
  2、重新编译MyApp工程,将MyApp.exe复制到服务器的共享目录中,注意一定不要覆盖本地的MyExe.app;
  3、这样服务器上MyApp.exe的修改时间肯定大于本地MyApp.exe的修改时间;
  4、运行本地MyApp.exe,几秒钟后屏幕上会出现"应用程序正在更新"的窗体,随后更新后应用程序再次被运行。则自动更新成功。
  5、程序的修改时间可通过在文件上用鼠标按右键的属性或内容的菜单观察。
  本程序在Windows98和VB6.0,NT局域网络下测试通过。
  本文内容也适用于其它语言参考。->

精彩图集

赞助商链接