?? 140.htm
字號(hào):
<p>VB實(shí)現(xiàn)應(yīng)用程序在局域網(wǎng)上自動(dòng)更新 </p>
<p></p>
<p> 我們?cè)谟肰B開發(fā)大型應(yīng)用程序時(shí)遇到如下問題,進(jìn)入調(diào)試、維護(hù)階段開發(fā)小組進(jìn)駐用戶單位,軟件交用戶試用會(huì)經(jīng)常修改程序并重新編譯。然后再由程序員給用戶復(fù)制更新,或者通知用戶自行復(fù)制更新。對(duì)于少量用戶可以做到及時(shí)更新。而我們的一個(gè)用戶在一座十層的大廈中辦公,有十幾個(gè)部門(即有管理部門又有生產(chǎn)車間分布在不同的樓層),每個(gè)部門少則有2~3臺(tái)工作站,多則有數(shù)十臺(tái)工作站,與四臺(tái)服務(wù)器組成局域網(wǎng)絡(luò).且每個(gè)部門應(yīng)用程序各不相同,應(yīng)用程序修改編譯后經(jīng)常不能同步更新,從而造成部門內(nèi)數(shù)據(jù)或者部門間的數(shù)據(jù)不一致。程序員每天都要跑上跑下檢查版本更新程序浪費(fèi)了很多寶貴時(shí)間,即使通知部門主管自行更新,某些工作站也會(huì)出現(xiàn)遺漏現(xiàn)象。鑒于以上問題我們考慮使用程序自動(dòng)更新技術(shù),即自動(dòng)檢查新版本,將新版本復(fù)制到本地,重新執(zhí)行本地應(yīng)用程序。</p>
<p></p>
<p> 基本原理:在某個(gè)服務(wù)器上共享出一個(gè)目錄,其權(quán)限為程序員完全控制,其它用戶只讀。</p>
<p></p>
<p> 例如:\\NtServer01\Refresh,程序員重新編譯后的應(yīng)用程序.EXE都存放在此目錄下。</p>
<p></p>
<p> 在應(yīng)用程序的入口處調(diào)用版本檢查及更新過程,如果服務(wù)器應(yīng)用程序的修改時(shí)間大于本地應(yīng)用程序的修改時(shí)間,則認(rèn)為有新版本出現(xiàn),應(yīng)該將服務(wù)器上的新版本復(fù)制到本地硬盤。</p>
<p></p>
<p> 由于應(yīng)用程序在運(yùn)行時(shí)不能被新版本覆蓋,所以就需要中介程序FastCopy.EXE(也用VB編寫)來完成更新版本并重新運(yùn)行本地應(yīng)用程序。為了達(dá)到及時(shí)更新的目的可在應(yīng)用程序中每隔5分鐘或10分鐘檢查一次是否有新版本。(此部分略有興趣的讀者可自行編程添加)</p>
<p></p>
<p>本例中:</p>
<p></p>
<p> 服務(wù)器:NtServer01 共享目錄: Refresh</p>
<p></p>
<p> 應(yīng)用程序:MyApp.exe 中介程序:FastCopy.exe (都存儲(chǔ)于共享目錄中)</p>
<p></p>
<p> 具體程序?qū)崿F(xiàn)如下:</p>
<p></p>
<p> 在應(yīng)用程序工程MyApp中的部分代碼如下:</p>
<p></p>
<p> Option Explicit</p>
<p></p>
<p> 注釋:編譯后的應(yīng)用程序名稱,注意沒有后綴 .EXE,本例為MYAPP</p>
<p></p>
<p> Private Const App_Name = "MyApp"</p>
<p></p>
<p> 注釋:最新的應(yīng)用程序存放的路徑,本例為:服務(wù)器 NtServer01 共享目錄 Refresh</p>
<p></p>
<p> Private Const ExePath = "\\NtServer01\Refresh\"</p>
<p></p>
<p> 注釋:中介程序名稱,注意沒有后綴 .EXE,本例為 FastCopy</p>
<p></p>
<p> Private Const MidExeName = "FastCopy"</p>
<p></p>
<p> 注釋:應(yīng)用程序入口</p>
<p></p>
<p> Private Sub Form_Load()</p>
<p></p>
<p> If UCase(Trim(App.EXEName)) <> UCase(Trim(App_Name)) Then</p>
<p></p>
<p> MsgBox "必須將訂單管理系統(tǒng)的名稱更改為: " + App_Name</p>
<p></p>
<p> End</p>
<p></p>
<p> End If</p>
<p></p>
<p> 注釋:判斷是否有最新版本的應(yīng)用程序,如有則自動(dòng)更新</p>
<p></p>
<p> Call ExeRefresh</p>
<p></p>
<p> 注釋:下面為訂單管理系統(tǒng)的正常操作 略 ... ....</p>
<p></p>
<p> End Sub</p>
<p></p>
<p> 注釋:版本檢查及更新過程</p>
<p></p>
<p> rivate Sub ExeRefresh()</p>
<p></p>
<p> 注釋:定義四個(gè)臨時(shí)字符串變量</p>
<p></p>
<p> Dim s1 As String</p>
<p></p>
<p> Dim s2 As String</p>
<p></p>
<p> Dim s3 As String</p>
<p></p>
<p> Dim s4 As String</p>
<p></p>
<p> On Error Resume Next</p>
<p></p>
<p> 注釋:將本地應(yīng)用程序MyApp.EXE的全路徑名存入 s1</p>
<p></p>
<p> 注釋:將本地中介程序FastCopy.exe的全路徑名存入 s3</p>
<p></p>
<p> s1 = "TNT"</p>
<p></p>
<p> If Len(App.Path) > 3 Then</p>
<p></p>
<p> s1 = App.Path + "\" + Trim(App_Name) + ".exe"</p>
<p></p>
<p> s3 = App.Path + "\" + MidExeName + ".EXE"</p>
<p></p>
<p> Else</p>
<p></p>
<p> s1 = App.Path + Trim(App_Name) + ".exe"</p>
<p></p>
<p> s3 = App.Path + MidExeName + ".EXE"</p>
<p></p>
<p> End If</p>
<p></p>
<p> s4 = "TNT"</p>
<p></p>
<p> 注釋:將本地應(yīng)用程序MyApp.EXE文件的修改時(shí)間存入 s4</p>
<p></p>
<p> s4 = FileDateTime(s1)</p>
<p></p>
<p> s2 = "TNT"</p>
<p></p>
<p> 注釋:將網(wǎng)絡(luò)上應(yīng)用程序MyApp.EXE文件的修改時(shí)間存入 s2</p>
<p></p>
<p> s2 = FileDateTime(ExePath + App_Name + ".EXE")</p>
<p></p>
<p> If s2 = "TNT" Then</p>
<p></p>
<p> MsgBox "沒有找到最新的可執(zhí)行文件:" + ExePath + App_Name + ".EXE" _ + vbCrLf + vbCrLf + "原因1:存放最新EXE的服務(wù)器或者工作站沒有打開;" _ + vbCrLf + "原因2:存放最新EXE的路徑錯(cuò)誤或者EXE文件不存在;" _+ vbCrLf + "請(qǐng)將此情況通知程序員." + vbCrLf + vbCrLf _+ vbCrLf + "按確定按鈕后,將繼續(xù)運(yùn)行本地EXE文件.", vbCritical, "提示"</p>
<p></p>
<p> End If</p>
<p></p>
<p> If s2 = "TNT" Or s4 = "TNT" Then Exit Sub</p>
<p></p>
<p> 注釋:如果網(wǎng)絡(luò)上應(yīng)用程序MyApp.EXE文件的修改時(shí)間,大于本地MyApp.EXE文件的修改時(shí)間</p>
<p></p>
<p> 注釋:然后再運(yùn)行本地MyApp.EXE ,中介程序退出后,整個(gè)更新過程結(jié)束.</p>
<p></p>
<p> If CDate(s2) > CDate(s4) Then</p>
<p></p>
<p> 注釋:將網(wǎng)絡(luò)上的中介程序FastCopy.exe復(fù)制到本地,這樣可防止本地?zé)o中介程序時(shí)無法進(jìn)行更新</p>
<p></p>
<p> FileCopy ExePath + MidExeName + ".EXE", s3</p>
<p></p>
<p> 注釋:則運(yùn)行中介程序FastCopy.exe ,將最新的MyApp.EXE 復(fù)制到本地</p>
<p></p>
<p> s1 = Shell(s3 + " " + ExePath + "," + App_Name + ".EXE", vbNormalFocus)</p>
<p></p>
<p> 注釋:本地應(yīng)用程序MyApp.EXE 終止運(yùn)行,否則已經(jīng)更新的MyApp.EXE無法覆蓋本地的MyApp.EXE .</p>
<p></p>
<p> End</p>
<p></p>
<p> End If</p>
<p></p>
<p> End Sub</p>
<p></p>
<p> 將以上程序編譯為:MyApp.exe 存儲(chǔ)在共享目錄中.</p>
<p></p>
<p></p>
<p> 在中介程序工程 FastCopy 中的代碼如下:</p>
<p></p>
<p> 向工程中增加一個(gè)窗體Form1 ,向Form1中添加一個(gè)定時(shí)器 Timer1 , 增加一個(gè)標(biāo)簽控件 Label1 ,其 Caption 為 "應(yīng)用程序正在更新",并調(diào)整窗體大小.</p>
<p></p>
<p> Option Explicit</p>
<p></p>
<p> Private sPath As String 注釋:用于存儲(chǔ)服務(wù)器上的共享目錄</p>
<p></p>
<p> Private sName As String 注釋:用于存儲(chǔ)應(yīng)用程序名</p>
<p></p>
<p> Private Sub Form_Load()</p>
<p></p>
<p> Dim s As String</p>
<p></p>
<p> 注釋:從應(yīng)用程序的命令行參數(shù)中取得數(shù)據(jù)</p>
<p></p>
<p> s = Trim(Command())</p>
<p></p>
<p> Dim p As Integer</p>
<p></p>
<p> p = InStr(1, s, ",")</p>
<p></p>
<p> If p > 0 Then</p>
<p></p>
<p> 注釋:取得儲(chǔ)服務(wù)器上的共享目錄</p>
<p></p>
<p> sPath = Mid(s, 1, p - 1)</p>
<p></p>
<p> 注釋:取得應(yīng)用程序名</p>
<p></p>
<p> sName = Mid(s, p + 1, Len(s) - p)</p>
<p></p>
<p> 注釋:定時(shí)器延時(shí)6秒,保證本地舊版應(yīng)用程序退出運(yùn)行</p>
<p></p>
<p> Timer1.Interval = 6000</p>
<p></p>
<p> Else</p>
<p></p>
<p> 注釋:參數(shù)錯(cuò)誤則退出</p>
<p></p>
<p> MsgBox "Error", vbCritical, ""</p>
<p></p>
<p> Unload Me</p>
<p></p>
<p> End</p>
<p></p>
<p> End If</p>
<p></p>
<p> End Sub</p>
<p></p>
<p></p>
<p> 注釋:定時(shí)器代碼</p>
<p></p>
<p> rivate Sub Timer1_Timer()</p>
<p></p>
<p> imer1.Interval = 0</p>
<p></p>
<p> Dim s1 As String</p>
<p></p>
<p> 取得應(yīng)用程序的本地路徑</p>
<p></p>
<p> If Len(App.Path) > 3 Then</p>
<p></p>
<p> s1 = App.Path + "\" + sName</p>
<p></p>
<p> lse</p>
<p></p>
<p> s1 = App.Path + sName</p>
<p></p>
<p> End If</p>
<p></p>
<p> 保證服務(wù)器關(guān)機(jī)或者路徑錯(cuò)誤仍可運(yùn)行舊版本</p>
<p></p>
<p> On Error Resume Next</p>
<p></p>
<p> 注釋:將服務(wù)器共享目錄中的最新版本復(fù)制到本地</p>
<p></p>
<p> FileCopy sPath + sName, s1</p>
<p></p>
<p> Dim a As Long</p>
<p></p>
<p> 注釋:執(zhí)行本地的應(yīng)用程序</p>
<p></p>
<p> a = Shell(s1, vbNormalFocus)</p>
<p></p>
<p> 注釋:中介程序退出運(yùn)行,應(yīng)用程序自動(dòng)更新結(jié)束</p>
<p></p>
<p> Unload Form1</p>
<p></p>
<p> End</p>
<p></p>
<p> End Sub</p>
<p></p>
<p> 將工程 FastCopy 編譯為FastCopy.exe 并存儲(chǔ)于服務(wù)器的共享目錄。</p>
<p></p>
<p></p>
<p> 測試:</p>
<p></p>
<p> 1、 將服務(wù)器共享目錄中的:MyApp.exe 復(fù)制到本地硬盤的某個(gè)目錄中;</p>
<p></p>
<p> 2、 重新編譯MyApp工程,將MyApp.exe復(fù)制到服務(wù)器的共享目錄中,注意一定不要覆蓋本地的MyExe.app ;</p>
<p></p>
<p> 3、 這樣服務(wù)器上MyApp.exe 的修改時(shí)間肯定大于本地MyApp.exe的修改時(shí)間;</p>
<p></p>
<p> 4、 運(yùn)行本地MyApp.exe ,幾秒鐘后屏幕上會(huì)出現(xiàn)"應(yīng)用程序正在更新"的窗體,隨后更新后應(yīng)用程序再次被運(yùn)行。則自動(dòng)更新成功。</p>
<p></p>
<p> 5、 程序的修改時(shí)間可通過在文件上用鼠標(biāo)按右鍵的屬性或內(nèi)容的菜單觀察。</p>
<p></p>
<p> 本程序在Windows 98 和 VB 6.0 ,NT局域網(wǎng)絡(luò)下測試通過。 </p>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -