Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Entwicklung / Update

Automatisches Programm-Update

Mit der unten gezeigten Routine wird es einer VB-Anwendung ermöglicht, in einem bestimmten Verzeichnis (sinnvollerweise auf einem Netzlaufwerk) nach einer neuen Version zu suchen. Falls eine solche vorhanden ist, so wird diese neue EXE lokal kopiert und von da an auch benutzt. Soviel zur Idee... Leider gibt es einige Probleme, die dabei auftreten können: Daher geht die Routine in folgenden Schritten vor (sei der Dateiname der Anwendung "test.exe"):
  1. Wird in dem angegeben Pfad eine neuere Version gefunden, so wird diese lokal kopiert, allerdings als "test.upd.exe" (dies vermeidet die Überschreibe-Konflikte). *1*
  2. Anschließend wird (via Shell und unter Berücksichtigung eventueller Parameter) "test.upd.exe" gestartet und die eigentliche Anwendung beendet. *2*
  3. Die neue (gerade lokal kopierte) Version "test.upd.exe" erkennt am Applikationsnamen (endet mit ".upd"), dass sie erstmals gestartet worden ist. Sie kopiert sich selbst an die Stelle der ursprünglichen "test.exe". *3*
  4. Anschließend wird (via Shell und unter Berücksichtigung eventueller Parameter) die neue Version als "test.exe" gestartet und "test.upd.exe" beendet. *4*
  5. Endlich läuft die neue Version unter dem richtigen Namen "test.exe"! Es bleiben nur noch Aufräumarbeiten, d.h. "test.upd.exe" wird gelöscht. *5*
Private Sub AutoUpdate(ByRef OrgPath As String)
  Dim AppPath As String
  Dim Versuch As Long
  Dim DateLocal As Double
  Dim DateNet As Double
  
  On Error Resume Next
  If LCase$(Right$(App.EXEName, 4)) <> ".upd" Then
    'Normale EXE wurde gestartet:
    
    AppPath = App.Path & "\" & App.EXEName
    If Len(Dir$(AppPath & ".upd.exe")) Then
      'Aufräumen, ggf. altes Update löschen:   *5*
      For Versuch = 1 To 10
        Err.Clear
        Kill AppPath & ".upd.exe"
        If Err.Number = 0 Then Exit For
        Pause 1
      Next Versuch
    End If
    
    'Zeitstempel vergleichen:   *1*
    DateLocal = FileDateTime(AppPath & ".exe")
    DateNet = FileDateTime(OrgPath)
    If DateNet > DateLocal Then
      Beep
      
      'Neue Version lokal kopieren:
      For Versuch = 1 To 10
        Err.Clear
        FileCopy OrgPath, AppPath & ".upd.exe"
        If Err.Number = 0 Then Exit For
        Pause 1
      Next Versuch
      
      If Err.Number Then
        'Wiederholter Fehler:
        Beep
        MsgBox _
            App.EXEName & " konnte nicht aktualisiert werden!", _
            vbInformation
      Else
        'Neue Version erstmals starten:   *2*
        Pause 0.1
        Shell AppPath & ".upd.exe " & Command$, vbNormalFocus
        End
      End If
    End If
  Else
    'Neue Version erstmals gestartet:
    
    AppPath = App.Path & "\" & _
        Left$(App.EXEName, Len(App.EXEName) - 4) & ".exe"
    
    '*.upd.exe nach *.exe kopieren:   *3*
    For Versuch = 1 To 10
      Err.Clear
      FileCopy App.Path & "\" & App.EXEName & ".exe", AppPath
      If Err.Number = 0 Then Exit For
      Pause 1
    Next Versuch
    
    If Err.Number Then
      'Wiederholter Fehler:
      Beep
      MsgBox _
          App.EXEName & " konnte nicht aktualisiert werden!", _
          vbInformation
    Else
      'Endlich die neue Version "richtig" starten:   *4*
      Pause 0.1
      Shell AppPath & " " & Command$, vbNormalFocus
      End
    End If
  End If
End Sub
Typischerweise würde man diese Routine z.B. in der Main-Prozedur verwenden, etwa so:
Sub Main()
  'Auf neue Version testen:
  AutoUpdate "\\SV-Daten\Abt3\Prog\Test\Test.exe"
  
  'Ansonsten Hauptformular anzeigen:
  frmMDI.Show
End Sub
Die hier verwendete Pause-Prozedur kann übrigens unter http://www.schwider.de/timestmp.htm gefunden werden.

© Jost Schwider, 03.08.2000-03.08.2000 - http://vb-tec.de/autoupd.htm