要更新的程序Update的代码
Option Explicit
'编译后的应用程序名称,注意没有后缀 .EXE,本例为MYAPP
Private Const App_Name = "Update"
'最新的应用程序存放的路径,本例为:服务器 NtServer01 共享目录 Refresh
Private Const ExePath = "\\192.168.150.37\VBTemp\Refresh\"
'中介程序名称,注意没有后缀 .EXE,本例为 FastCopy
Private Const MidExeName = "FastCopy"'应用程序入口
Private Sub Form_Load()
    If UCase(Trim(App.EXEName)) <> UCase(Trim(App_Name)) Then
        MsgBox "必须将订单管理系统的名称更改为: " + App_Name
        End
    End If
    
    '判断是否有最新版本的应用程序,如有则自动更新
    Call ExeRefresh
    
    '下面为订单管理系统的正常操作 略 ... ....
End Sub'版本检查及更新过程
Private Sub ExeRefresh()
    '定义四个临时字符串变量
    Dim s1 As String
    Dim s2 As String
    Dim s3 As String
    Dim s4 As String
    
    On Error Resume Next
    '将本地应用程序Update.EXE的全路径名存入 s1
    '将本地中介程序FastCopy.exe的全路径名存入 s3
    s1 = "TNT"
    
    '程序的路径等于三的时候表示某个盘符的根目录,例如 d:\
    If Len(App.Path) > 3 Then
        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"
    End If
    
    s4 = "TNT"
    '将本地应用程序Update.EXE文件的修改时间存入 s4
    s4 = FileDateTime(s1)
    s2 = "TNT"
    '将网络上应用程序Update.EXE文件的修改时间存入 s2
    s2 = FileDateTime(ExePath + App_Name + ".EXE")
    
    If s2 = "TNT" Then
        MsgBox "没有找到最新的可执行文件:" + ExePath + App_Name + ".EXE" _
        + vbCrLf + vbCrLf + "原因1:存放最新EXE的服务器或者工作站没有打开;" _
        + vbCrLf + "原因2:存放最新EXE的路径错误或者EXE文件不存在;" _
        + vbCrLf + "请将此情况通知程序员." + vbCrLf + vbCrLf _
        + vbCrLf + "按确定按钮后,将继续运行本地EXE文件.", vbCritical, "提示"
    End If
    
    If s2 = "TNT" Or s4 = "TNT" Then Exit Sub
        '如果网络上应用程序Update.EXE文件的修改时间,大于本地Update.EXE文件的修改时间
        '然后再运行本地Update.EXE ,中介程序退出后,整个更新过程结束.
        
    If CDate(s2) > CDate(s4) Then
        '将网络上的中介程序FastCopy.exe复制到本地,这样可防止本地无中介程序时无法进行更新
        FileCopy ExePath + MidExeName + ".EXE", s3
        '则运行中介程序FastCopy.exe ,将最新的Update.EXE 复制到本地
        s1 = Shell(s3 + " " + ExePath + "," + App_Name + ".EXE", vbNormalFocus)
        '本地应用程序Update.EXE 终止运行,否则已经更新的Update.EXE无法覆盖本地的Update.EXE .
        End
    End If
End Sub
FastCopy 工程代码Option Explicit
Private sPath As String '用于存储服务器上的共享目录
Private sName As String '用于存储应用程序名Private Sub Form_Load()
    Dim s As String
    '从应用程序的命令行参数中取得数据
    '接收在Update工程中 s1 = Shell(s3 + " " + ExePath + "," + App_Name + ".EXE", vbNormalFocus) 传过来的参数
    s = Trim(Command())
    Dim p As Integer
    p = InStr(1, s, ",")
    
    If p > 0 Then
        '取得储服务器上的共享目录
        sPath = Mid(s, 1, p - 1)
        '取得应用程序名
        sName = Mid(s, p + 1, Len(s) - p)
        '定时器延时6秒,保证本地旧版应用程序退出运行
        Timer1.Interval = 6000
    Else
        '参数错误则退出
        MsgBox "Error", vbCritical, ""
        Unload Me
        End
    End If
End Sub
'定时器代码
Private Sub Timer1_Timer()
    Timer1.Interval = 0
    Dim s1 As String
    
    '取得应用程序的本地路径
    If Len(App.Path) > 3 Then
        s1 = App.Path + "\" + sName
    Else
        s1 = App.Path + sName
    End If
    
    '保证服务器关机或者路径错误仍可运行旧版本
    On Error Resume Next
    '将服务器共享目录中的最新版本复制到本地
    FileCopy sPath + sName, s1
    Dim a As Long
    '执行本地的应用程序
    a = Shell(s1, vbNormalFocus)
    '中介程序退出运行,应用程序自动更新结束
    Unload Form1
    End
End Sub问题:
1.在这一段
If CDate(s2) > CDate(s4) Then
        '将网络上的中介程序FastCopy.exe复制到本地,这样可防止本地无中介程序时无法进行更新
        FileCopy ExePath + MidExeName + ".EXE", s3
        '则运行中介程序FastCopy.exe ,将最新的Update.EXE 复制到本地
        s1 = Shell(s3 + " " + ExePath + "," + App_Name + ".EXE", vbNormalFocus)
        '本地应用程序Update.EXE 终止运行,否则已经更新的Update.EXE无法覆盖本地的Update.EXE .
        End
End If是通过什么使Update.Exe 终止运行的?2.还有就是如何让两个工程一起联起来调试?3.还有这段
If p > 0 Then
        '取得储服务器上的共享目录
        sPath = Mid(s, 1, p - 1)
        '取得应用程序名
        sName = Mid(s, p + 1, Len(s) - p)
        '定时器延时6秒,保证本地旧版应用程序退出运行
        Timer1.Interval = 6000
    Else
        '参数错误则退出
        MsgBox "Error", vbCritical, ""
        Unload Me
        End
    End If我感觉传过来的参数是本地路径\Update\FastCopy.EXE \\192.168.150.37\VBTemp\Refresh\,Update.exe'取得储服务器上的共享目录
        sPath = Mid(s, 1, p - 1)
这个好像不能取到服务器的目录吧小弟水平太菜请各位高说指点一二,谢谢!

解决方案 »

  1.   

    1.在这一段
    If CDate(s2) > CDate(s4) Then
            '将网络上的中介程序FastCopy.exe复制到本地,这样可防止本地无中介程序时无法进行更新
            FileCopy ExePath + MidExeName + ".EXE", s3
            '则运行中介程序FastCopy.exe ,将最新的Update.EXE 复制到本地
            s1 = Shell(s3 + " " + ExePath + "," + App_Name + ".EXE", vbNormalFocus)
            '本地应用程序Update.EXE 终止运行,否则已经更新的Update.EXE无法覆盖本地的Update.EXE .
            End
    End If是通过什么使Update.Exe 终止运行的?
    ----------
    End If 上面一行不是End 吗,就是退出程序,
    2.还有就是如何让两个工程一起联起来调试?
    -------------
    你用工程组试试,不过最好还是编译后测试看有什么错误3.还有这段
    If p > 0 Then
            '取得储服务器上的共享目录
            sPath = Mid(s, 1, p - 1)
            '取得应用程序名
            sName = Mid(s, p + 1, Len(s) - p)
            '定时器延时6秒,保证本地旧版应用程序退出运行
            Timer1.Interval = 6000
        Else
            '参数错误则退出
            MsgBox "Error", vbCritical, ""
            Unload Me
            End
        End If我感觉传过来的参数是本地路径\Update\FastCopy.EXE \\192.168.150.37\VBTemp\Refresh\,Update.exe'取得储服务器上的共享目录
            sPath = Mid(s, 1, p - 1)
    这个好像不能取到服务器的目录吧
    ----------------------
    s1 = Shell(s3 + " " + ExePath + "," + App_Name + ".EXE", vbNormalFocus)Shell命令,空格前是要执行的程序,空格后才是传给程序的命令行参数(此例中参数是用逗号分割的)