用VB6寫在線更新程序(上篇)(1/3)

VB6寫在線更新程序(上篇)

說起VB6,算是老朋友了,從學計算機開始就接觸它了。然而,有了Delphi5之後,再也不想用它了。畢竟,在OOP流行的年代,Delphi相繼推出了6789101112就不說了,傷心!),而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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章