Eine Update funktion für Programme?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Shuyin
Beiträge: 31
Registriert: 17.12.2005 15:29

Beitrag von Shuyin »

Danke für alles :mrgreen:

Genau so muss ein Community sein: sehr hilfsbereit und nett ;)


, Shuyin
Zomtec
Beiträge: 33
Registriert: 07.06.2005 14:46
Wohnort: Bayern
Kontaktdaten:

Beitrag von Zomtec »

Auf der Suche nach einer Update-Funktion für mein Programm bin ich auf diesen Thread gestoßen. War für mich nicht ganz so zufriedenstllend, deshalb habe ich mir meine eigene Update-Routine geschrieben (PBOSL muss installiert sein):

Upzudatendes Programm:

Code: Alles auswählen

;Versionkonstante
#Version$ = "Version x.x"
#updater$ = "Version x.x"

Procedure UpdateCheck()
  ;Verwendete Variablen
  ExeVerzeichnis$ = "c:\programme\mainexe\"     ;Verzeichnis des Hauptprogramms
  URL.s = "http://home.arcor.de/pb_zomtec/hc/"  ;Updateserver
  exename$ = "MainProgramm.exe"                 ;Name des zu aktualierenden Programms

  
  Version_datei$ = ExeVerzeichnis$ + "version.txt"
  ;version.txt vom Server laden:
  URLDownloadToFile_(0, URL.s + "version.txt", Version_datei$, 0, 0)
  If ReadFile(0, Version_datei$)  ;version.txt auslesen
    Versionsnummer$ = ReadString()  ;versionsnr. von Handlcopy
    Versionupdater$ = ReadString()  ;versionsnr. der update.exe
    CloseFile(0)

;MessageRequester-updatetext      
      a$ = "Neue Version vorhanden!" + Chr(10) + Chr(10)
      a$ + "Soll ich die neue Version herunterladen und installieren?" + Chr(10) + Chr(10)
      a$ + "Bestehende Internetverbindung erforderlich!"
    If Versionupdater$ <> #updater$ ;Serverversion mit lokaler vergleichen
      a = MessageRequester(a$, "Updatecheck von update.exe", #PB_MessageRequester_YesNo)
      If a=#PB_MessageRequester_Yes
        URLDownloadToFile_(0, URL.s + "update.exe", ExeVerzeichnis$ + "update.exe", 0, 0) ;neue update.exe-Version vom Server laden
      EndIf
    EndIf
    
    If Versionsnummer$ <> #Version$ ;Serverversion mit lokaler vergleichen
      a = MessageRequester(a$, "Updatecheck von MainProgramm.exe", #PB_MessageRequester_YesNo)
      If #PB_MessageRequester_Yes
        ;Übergabeparameter
        a$ = ExeVerzeichnis$ + " "    ;.exe-Startverzeichnis
        a$ + URL.s + " "              ;Download-URL des Updates
        a$ + exename$                 ;Name der zu updatenden .exe (incl. .exe-Extension)
        If RunProgram(ExeVerzeichnis$+"update.exe", a$, "")
          Delay(2000)
          End
        Else
          a$ = "Update.exe nicht gefunden!" + Chr(10) + Chr(10)
          a$ + "update.exe ist für's Update erforderlich." + Chr(10) + Chr(10)
          a$ + "Bitte erst update.exe runterladen..."
          MessageRequester(a$, "Fehler!")
        EndIf
      EndIf
    Else
      MessageRequester("Updatecheck","Keine neue Version vorhanden!")
    EndIf
  Else
    MessageRequester("Fehler!","Version konnte nicht überprüft werden! Besteht Internetverbindung?")
  EndIf
EndProcedure
Update-Programm (update.exe)

Code: Alles auswählen

;update.exe 1.02
;(c) by zomtei 02/2006

;übergebene Parameter auslesen
ExeVerzeichnis$ = ProgramParameter()
URL.s = ProgramParameter()
exename$ = ProgramParameter()

;wenn exename$ leer dann wurde update.exe vermutl. durch Doppelklick gestartet
If exename$=""
  MessageRequester("Fehler!", "update.exe kann nicht als eigenständiges Programm aufgerufen werden!")
  End
EndIf

exenameNoextension$ = ExeVerzeichnis$ + RemoveString(exename$, ".exe", 1) ;Programmname ohne .exe
NeueDatei$ = exenameNoextension$ + "NewVersion.exe"  ;temporärer Name der neuen Version

URLDownloadToFile_(0, URL.s + exename$, NeueDatei$, 0, 0) ;neue Version vom Server laden
dl = FileSize(NeueDatei$)

;Prüfen ob zu aktualisierende .exe beendet wurde
While AppRunning(exename$) And a<10
  Delay(2000)
  a+1
Wend

If AppRunning(exename$)=0 Or dl=-1 ;zu aktualisierende .exe wurde nicht beendet oder File konnte nicht runtergeladen werden
  MessageRequester("Fehler!", "Updateinstallation fehlgeschlagen!")
Else
  If DeleteFile(exenameNoextension$+".bak") : EndIf           ;Alte Backup-Datei löschen
  If RenameFile(ExeVerzeichnis$+exename$, exenameNoextension$+".bak") : EndIf ;Alte .exe in .bak umbenennen
  If RenameFile(NeueDatei$, exenameNoextension$+".exe") : EndIf ;neue Version in .exe umbenennen
  MessageRequester("Update","Update erfolgreich durchgeführt",0)
  If RunProgram(ExeVerzeichnis$+exename$, "", "") : EndIf
EndIf
Ich habe es unter w2k/xp getestet und es hat einwandfrei funktioniert. Da ich noch Anfänger in Sachen PB bin, weiß ich natürlich nicht ob das die optimale Lösung ist. Für meine Zwecke reicht es jedenfalls. Für Kritik bin ich auf jeden Fall dankbar...
mfg
Zomtec
------------
noch PB 3.94
Antworten