Online Update für eigenes Programm

  • Hallo!

    Ich will für mein Programm ein Online-Update einbauen. Ich habe mir gedacht, dass ich einen Webspace mit fester URL brauche, in der dann der Link zur neuen Version steht. Diese soll dann automatisch heruntergeladen werden und die alte exe-Datei ersetzen. Geht das so einfach? Oder muss ich einen extra Updater programmieren, der jedesmal bei Programmstart auf ne neue Version prüft...

    MFG Taek

    Einmal editiert, zuletzt von Taek (16. Oktober 2008 um 11:06)

  • Wenn man wirklich ausschließlich nur eine exe-Datei verwenden möchte, muss man in der nach Updates suchen, herunterladen und dann aus der Exe heraus ein Batchjob generieren, der dann gestartet wird.
    Danach muss sich die Exe beenden und der Batchjob muss heruntergeladene Datei mit alter Datei ersetzen und anschließend das Tool starten.

    Mit einem Updater kann man diese Aktionen grafisch aufwerten, aber der Ablauf bleibt denk ich mal gleich ;)

  • OK, d.h. ich brauch 2 "Programme"...
    Dann werd ich mich mal daran machen. Wenns Probleme gibt, meld ich mich nochmal...

  • Hi Taek.

    Benutze für meine Skripte ebvenfalls automatische Updates und löse das wiefolgt:

    Der Benutzer verbindet sich zu meinem FTP-Onlinespeicher.
    Es werden 2 Dateien heruntergeladen,welche jeweils nur 1 Byte groß sind,da in diesen Dateien nur die Wörter "no" drinsteht.
    Ist nun ein Update notwendig,schreibe ich in die Datei "yes" rein (und lade die nötigen Dateien hoch).
    Das Skript liest nun das "yes" und sieht daran,dass Updates notwendig sind und lädt dann die Dateien vom FTP herunter.

    Das große Vorteil ist,dass das Check nach Updates ca. 5 Sekunden dauert,was eigentlich für mich der beste Fall ist.

    Hoffe geholfen zu haben und hoffe auf Rückmeldung

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    • Offizieller Beitrag

    PHP-Datei hochladen, die nur einen Link auf die aktuelle Version liefert, wenn es eine neue Version gibt, ansonsten einen leeren String. Die aktuell installierte Version kann man als Parameter mit übergeben. Das dürfte deutlich schneller sein und v.a. kann man genau sagen, ob ein Update nötig ist oder nicht (ein einfaches "yes" wird nie allgemein für alle User stimmen ;) ).

    peethebee

  • Eigentlich schon.....
    Das Programm sieht ja nur n ach,ob da Yes steht,wieso sollte das nicht für alle gelten?

    Zitat

    Programmieren ist so lange lustig bis ein Fehler auftritt!


    ~ Dankeschön

    • Offizieller Beitrag

    User 1 nutzt Version 0.1, User 2 Version 0.2, User 3 Version 0.3, Version 0.3 ist aktuell. Wem zeigst du yes an? Muss zumindest von der aktuell eingesetzten Version abhängen. Denn sobald User 1 Version 0.3 installiert hat, musst du ihm ja "no" liefern, sonst nervt es ihn.

    peethebee

  • der beste weg ist immer noch der:

    Spoiler anzeigen
    [autoit]

    Dim $ver = "1.3.9"
    InetGet("http://irgendwas/update.txt",@TempDir & "\update.txt", 1, 0)
    $file = FileOpen(@TempDir & "\update.txt", 0)
    $line = FileReadLine($file, 1)
    $line2= FileReadLine($file, 2)
    If $line = $ver Then
    MsgBox(64, "Kein Update", "Du hast die neuste Version: (" & $ver & ")")
    FileClose($file)
    FileDelete(@TempDir & "\update.txt")
    Else
    MsgBox(64, "Update!", "Es ist eine Neue Version verfügbar!")
    $fg = MsgBox(4, "Updaten?", "Möchtest du jetzt Updaten?")
    If $fg = 6 Then
    InetGet("http://irgendwas/files/" & $line2, $line2, 1, 0) ; ANPASSEN
    FileClose($file)
    FileDelete(@TempDir & "\update.txt")
    Exit 0
    EndIf
    EndIf

    [/autoit]

    Dann muss in der txt Datei noch was stehen

    Code
    1.8.3 z.B. und line2 Dateiname. z.B. mytool.exe

    Gruß Mario2323

  • Nicht ganz. Wenn du Betas verteilst, werden die auf die letzte stable "geupdated" :)

    2 Mal editiert, zuletzt von progandy (18. Oktober 2008 um 18:16)

  • Auch wieder wahr.

    Dann deaktiviert man die Update-Funktion für die Betas einfach 8o


    Stimmt auch wieder :)
    Hab hier aber mal einen Versionscheck mit nummerntest gemacht :)

    Spoiler anzeigen
    [autoit]


    $Vers1 = "3.13.4"
    $Vers2 = "2.13.4"
    $Vers3 = "3.14.2"
    $Vers4 = "3.14.2.1"
    ConsoleWrite($Vers1 & "--" & $Vers2 & "->" & _VersionCheck($Vers1,$Vers2) & @CRLF)
    ConsoleWrite($Vers1 & "--" & $Vers3 & "->" & _VersionCheck($Vers1,$Vers3) & @CRLF)
    ConsoleWrite($Vers1 & "--" & $Vers4 & "->" & _VersionCheck($Vers1,$Vers4) & @CRLF)
    ConsoleWrite($Vers2 & "--" & $Vers3 & "->" & _VersionCheck($Vers2,$Vers3) & @CRLF)
    ConsoleWrite($Vers2 & "--" & $Vers4 & "->" & _VersionCheck($Vers2,$Vers4) & @CRLF)
    ConsoleWrite($Vers3 & "--" & $Vers4 & "->" & _VersionCheck($Vers3,$Vers4) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; If New Version is available, return 1
    ; by Prog@ndy
    Func _VersionCheck($OldVer,$NewVer,$Delimiters=".")
    $OldVer = StringSplit($OldVer,$Delimiters)
    $NewVer = StringSplit($NewVer,$Delimiters)
    Local $UBOUNDMIN = UBound($OldVer)
    If $UBOUNDMIN > UBound($NewVer) Then $UBOUNDMIN = UBound($NewVer)

    For $i = 1 To $UBOUNDMIN-1
    If Number($OldVer[$i]) < Number($NewVer[$i]) Then Return 1
    Next

    If UBound($NewVer) > UBound($OldVer) Then Return 1
    ; Wenn alle Versionen gleich sind, aber die neue Version mehr unterversionen hat, ist sie neu

    Return 0
    EndFunc

    [/autoit]
  • Ach das Thema geht ja noch weiter :D
    Okay ich denk ich werds mit Datum anstatt Versionsnummern machen, aber momentan komm ich eh nicht dazu, vielleicht bis Ende der Woche...

    Danke soweit für die Tipps!

  • ich habs auch mit versionsnummer gelöst

    auf meinem FTP befindet sich eine ini mit der aktuellen version

    Programm prüft am anfang einfach ob die eigene versionsnummer kleiner als die in der ini ist und voila lädt das update runter
    als kleiner tipp:

    ich hab mir schon oft mein script versemmelt indem ich mit scite F5 drückte er die neue version runtergeladen hatte und somit mit der aktuellen datei ersetzt wurde d.h. meine .au3 sah im endeffekt wie eine .exe aus... und somit unbrauchbar deswegen hab ich noch einen schutz eingebaut: die jetztige datei muss eine exe sein und der prozess autoit3 darf nicht laufen

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Um zwischen kompiliert und nicht kompiliert zu unterscheiden, würde ich am besten das verwenden:

    Spoiler anzeigen
    [autoit]

    Func _GetScriptType()
    Select
    Case Not @Compiled
    Return "au3"
    Case StringRight(@ScriptName,4) = ".a3x"
    Return "a3x"
    Case Else
    Return "exe"
    EndSelect
    EndFunc

    [/autoit]


    Damit kann zwischen Skript ( beliebige Endung), a3x (nur Endung .a3x) und exe underschieden werden :)