在数据库里面有一个更新路径字段,各客户端如发现自身与服务器上的exe文件不一致,即自动更新。
我是这样写的:
    '是否需要更新
    '得到更新路径
    SQLstring = "select UPDataPath from YHSysData where 1=1"
    Dim Rs As New ADODB.Recordset
    Set Rs = SQL.ExecQuery(SQLstring)
    If Rs.EOF Then
       MsgBox "您未设定更新路径!"
    Else
       Dim FSO As New FileSystemObject
       If FSO.FileExists(Rs!UpDataPath & "") = False Then
       
          MsgBox "您未设定文件更新源或更新源不存在!有可能您使用的是旧版ERP系统,请与软件服务商联系!"
       Else
          '得到服务器文件的修改日期
          Dim F_UpExeDate As String
          Dim F_MeExeDate As String
          F_UpExeDate = FileDateTime(Rs!UpDataPath & "")
          On Error Resume Next
          F_MeExeDate = FileDateTime(App.Path & "\" & App.EXEName & ".exe")
          If F_UpExeDate <> F_MeExeDate Then
             If MsgBox("发现有新版本,是否立即更新?", vbInformation + vbYesNo, "提示") = vbYes Then
                '得到旧文件名及地址
                Dim F_Old As String
                F_Old = App.Path & "\" & App.EXEName & ".exe"
                
                '查看文件是否存在
                If FSO.FileExists(App.Path & "\" & Format(F_MeExeDate, "YYYYMMDDhhmmss") & ".exe") = True Then
                   Kill (App.Path & "\" & Format(F_MeExeDate, "YYYYMMDDhhmmss") & ".exe")
                End If
                
               '修改文件名
                Name F_Old As App.Path & "\" & Format(F_MeExeDate, "YYYYMMDDhhmmss") & ".exe"
                
                '将新文件COPY上来
                FileCopy Rs!UpDataPath & "", F_Old
                MsgBox "更新完毕!请重新打开ERP!"
                
                Unload Me
                Exit Sub
             End If
          End If
       End If
       
    End If测试通过了,但很烦的一个问题:当我在运行工程的时候,会出错。大家讨论一下,该怎么解决呢?我怎么来判断当前是运行工程还是运行EXE?

解决方案 »

  1.   

    这岂不是很简单?以前讨论过N次了function InIDE() as boolean
    on error goto err1
    debug.print 1/0
    exit function
    err1:
    err.clear
    InIDE=true
    end function
      

  2.   


    一般都是采用这种方法,但是这样必须将更新的那个程序放在同一目录下,而我因为可以随时把ERP.exe复制到任何位置进行打开,故有可能用户不会把更新的文件放在一起。如果解决了在运行工程的时候出错的问题(zzyong00 已解决),那么我的方案似乎可行,大家再提意见
      

  3.   

    我的原理是:
    1.判断是否更新
    2.修改自己的文件名作备份
    3.将最新的COPY到本地,由于旧的文件的文件名被修改,故不会提示有人在使用无法覆盖
    4.关闭旧的打开新的(好像这地方会出错,我在打开ERP的时候会判断是否已经打开,我采用shell打开新的一直会提示已经打开,虽然旧的我已经unload 了
             unload me
            shell 新的
             exit sub
      

  4.   


    把路径写到ini文件或者注册表里面,更新的时候读一下就知道更新的文件在哪里了
      

  5.   

    写ini文件有一个缺点,当路径更改后,客户端的ini文件没有及时更新过来,当然可以控制,但我还是觉得不用两个程序用一个好控制些
      

  6.   

    http://topic.csdn.net/u/20090331/10/03f3d808-660e-4f1f-b827-c89729927976.html
    这个帖子中有好几种方法都可以判断当前是否在VB IDE环境下
      

  7.   

    程序更新最好是只更新Dll,更新主窗口的不多.
      

  8.   

    主程序写成Active EXE,并提供一个表示所在路径的属性,辅助程序用CreateObject方式调用,并根据其所在路径进行更新。你说的问题是两个问题,一个是判断是否在开发环境中,LS的已有答案,另一个才是更新可执行文件。如果不想用两个程序来实现,可以使用自删除技术,即由主程序生成一个用于更新的临时VBS文件就可以了。
      

  9.   

    VB实现自删除写好了,代码如下:'* ******************************************************* *
    '*    程序名称:DelMe.bas
    '*    程序功能:在VB中实现应用程序自删除
    '*    作者:lyserver
    '*    联系方式:http://blog.csdn.net/lyserver
    '* ******************************************************* *Sub Main()
        Call DelMe
    End SubPublic Sub DelMe()
        Dim fn As Integer
        If App.LogMode Then
            fn = FreeFile()
            Open "del.tmp.vbs" For Output As fn
            Print #fn, "Dim FSO,WMI"
            Print #fn, "Set WMI=GetObject(" & Chr(34) & "winmgmts:\\." & Chr(34) & ")"
            Print #fn, "Set FSO=CreateObject(" & Chr(34) & "Scripting.FileSystemObject" & Chr(34) & ")"
            Print #fn, "Do While WMI.ExecQuery(" & Chr(34) & _
                    "SELECT * FROM WIN32_PROCESS WHERE NAME='" & App.EXEName & ".EXE'" & Chr(34) & ").Count"
            Print #fn, "WScript.Sleep 1"
            Print #fn, "Loop"
            Print #fn, "FSO.DeleteFile " & Chr(34) & App.Path & "\"; App.EXEName & ".EXE" & Chr(34)
            Print #fn, "FSO.DeleteFile " & Chr(34) & App.Path & "\del.tmp.vbs" & Chr(34)
            Print #fn, "Set FSO=Nothing"
            Print #fn, "Set WMI=Nothing"
            Close #fn
            Shell "WScript.Exe del.tmp.vbs", vbHide
        End If
    End Sub