程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 用VB實現應用程序在局域網絡上自動更新

用VB實現應用程序在局域網絡上自動更新

編輯: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局域網絡下測試通過。
  本文內容也適用於其它語言參考。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved