用VB6寫在線更新程序(上篇)
說起VB6,算是老朋友了,從學計算機開始就接觸它了。然而,有了Delphi5之後,再也不想用它了。畢竟,在OOP流行的年代,Delphi相繼推出了6和7(8、9、10、11、12就不說了,傷心!),而VB還是6.0,等到7.1出來之後,已經不是VB了,而是VB.NET,需要.NET Framework的支持,太麻煩了。
曾經有人說過,VB非常強大,幾乎無所不能(當然,其實是依賴於Win32 API的運用,這點他不說也知道),甚至還說比Delphi強,這一點我是強烈反對的。先不說藉助API不算是它的能力,用起來的感覺就不一樣,沒有指針、沒有動態鏈表也就算了,就連最常用、的最基本的函都沒實現(或者說內置),實在是難以容忍(可別再提API了,難道判斷一個目錄是否存在也要用API嗎?封裝一下也好呀。)!
最近在修改一個VB寫的程序,爲了增加下載更新功能,折騰好幾天,還好沒出現失敗中止的慘劇,還是憑着好奇心堅持寫出來了。實現的功能並不複雜,主要是寫一個下載文件的更新程序,並修改主程序入口,讓程序啓動時檢查更新,如果有新版本就啓動更新程序進行下載。另外再寫一個用於發佈文件(也就是將文件拷貝到網絡上)並更新配置文件的程序。當然,這只是局域網上使用的,並沒有實現FTP上傳功能。主要是對文件(版本信息等)的操作及XML技術的應用。這個思路我已經用了很久了,Delphi版本與C#.NET版本早就寫出來了,所以,這次的工作有點像翻譯。
「更新程序的編寫」
更新程序首先要實現對XML配置文件的解析,得到需要更新的文件,再者就是比對這些文件的版本(或修改時間),並從網絡上下載它們到本地覆蓋舊文件。
首先,爲了使程序更通用一些,更新程序必需的配置文件名與要更新的主程序文件名使用命令行參數傳入。問題來了,對命令行參數的處理,在Delphi裏是現成的,直接使用ParamStr數組即可;然而,VB6裏只有一個Command變量,得到命令行的原始字符串,還需要自行拆分。
對命令行的拆分,本想直接用Split函數(這個函數不錯,相對於Delphi,唯一令我讚賞的)簡單拆分的,但是,得有點容錯能力才行,命令中可能會出現雙引號的哦。想依照Delphi的拆分方法(Delphi中幾乎所有源碼都可以跟蹤查看的!再贊一下Delphi,呵呵)的,但Delphi中用的是PChar,一種同時具備指針和字符串特性的類型,這在VB中根本沒有替代品。沒辦法,只有自己再創造一個算法了。所以,就有了下面這段拆分命令行參數的代碼了(想了很久的,真的頭都快要想爆了):
'{ 將命令行參數拆分到數組。Cable Fan 2009-08-13 } Public Function SplitCommandLine(CommandLine As String) As Variant Dim Lines() As String Dim S As String Dim i As Integer Dim j As Integer Dim Quot As Boolean Dim P As String
S = CommandLine j = -1 While S <> "" ' 是否雙引號開頭。 If Left(S, 1) = """" Then Quot = True S = Mid(S, 2, Len(S)) ' 剔除雙引號。 Else Quot = False End If
' 查找參數結束點。 For i = 1 To Len(S) If i = Len(S) Then ' 查找到最後。 If Quot And Right(S, 1) = """" Then P = Left(S, Len(S) - 1) ' 有雙引號結束。 Else P = S ' 無雙引號開頭與結束。 End If S = "" Quot = False Exit For ElseIf Mid(S, i + 1, 1) = " " Then ' 遇到分隔符(空格)。 If Quot Then If Mid(S, i, 1) = """" Then ' 找到結束雙引號。 P = Left(S, i - 1) S = Mid(S, i + 2, Len(S)) Quot = False Exit For End If Else '不以雙引號結束。 P = Left(S, i) S = Mid(S, i + 2, Len(S)) Exit For End If End If Next
' 將參數添加到數組。 j = j + 1 ReDim Preserve Lines(j) Lines(j) = P Wend
SplitCommandLine = Lines End Function |
經過了簡單的測試,基本上可以應付Windows下規範的命令行參數了。用法很簡單,就像下面的幾句即可:
Dim Lines() As String Lines = SplitCommandLine(Command) ‘ 調用命令行拆分函數。 If UBound(Lines) >= 0 Then ConfigFile = Lines(0) If UBound(Lines) >= 1 Then AppFile = Lines(1) |