Download trotz ausführen der Datei fertigstellen?

  • Hallo Mitglieder.

    Ich habe meinen Launcher/Updater nun zu 90% fertig.
    Was noch fehlt, ist eine Favoriten Funktion.
    Zu der komme ich aber später.

    Mein Update soll die .exe downloaden, die gerade zum downloaden ausgeführt wird.
    Da die .exe jedoch geöffnet ist, kann er diese also nicht ersetzten.

    Ich wollte gerne wissen, ob man dies irgendwie beheben kann.

    Hier mal mein Script.

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=Icon.ico
    #AutoIt3Wrapper_outfile=Launcher.exe
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #Region
    #EndRegion
    ; ================================;
    ; Minecraft Launcher
    ; Made by Aldeos
    ; © 2011 Aldeos.de
    ; ================================;

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

    ;====Includes====;
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    If Not FileExists(@AppDataDir & "\.minecraft\Splash.jpg") Then FileInstall("Splash.jpg", @AppDataDir & "\.minecraft\Splash.jpg") ;- Fragt ab, ob Splash.bmp existiert, falls nicht installiert er diese Datei.
    If Not FileExists(@AppDataDir & "\.minecraft\Minecraft.exe") Then FileInstall("Minecraft.exe", @AppDataDir & "\.minecraft\Minecraft.exe") ;- Fragt ab, ob Minecraft.exe existiert, falls nicht installiert er diese Datei.

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

    ;====GUI====;
    $GUI = GUICreate("Minecraft Launcher by Aldeos.de", 401, 231, 273, 176) ;- Erstellt die GUI.
    $NAME = GUICtrlCreateLabel("Login:", 104, 42, 33, 17) ;- Erstellt den Label "Login:".
    $NAME_READ = IniRead(@AppDataDir & "\.minecraft\Launcher.ini", "Config", "NAME", "") ;- Liest aus der Launcher.ini die Wert NAME aus der Sektion Config.
    $NAME_INPUT = GUICtrlCreateInput($NAME_READ, 160, 40, 121, 21) ;- Erstellt ein Eingabefeld für den Namen.
    $PASSWORD = GUICtrlCreateLabel("Password:", 104, 70, 53, 17) ;- Erstellt den Label "Password:".
    $PASS_READ = IniRead(@AppDataDir & "\.minecraft\Launcher.ini", "Config", "PASS", "");- Liest aus der Launcher.ini die Wert PASS aus der Sektion Config.
    $PASSWORD_INPUT = GUICtrlCreateInput($PASS_READ, 160, 68, 121, 21, $ES_PASSWORD);- Erstellt ein Eingabefeld für das Password.
    $IP = GUICtrlCreateLabel("IP:", 104, 98, 17, 17) ;- Erstellt den Label "IP:".
    $IP_READ = IniRead(@AppDataDir & "\.minecraft\Launcher.ini", "Config", "IP", "");- Liest aus der Launcher.ini die Wert IP aus der Sektion Config.
    $IP_INPUT = GUICtrlCreateInput($IP_READ, 160, 96, 121, 21);- Erstellt ein Eingabefeld für die IP.
    $START = GUICtrlCreateButton("Start", 194, 128, 89, 25, $WS_GROUP) ;- Erstellt einen Button mit der Aufschrift "Start" zum starten des Spieles.
    $UPDATE = GUICtrlCreateButton("Update", 104, 128, 81, 25, $WS_GROUP) ;- Erstellt einen Button mit der Aufschrift "Update" zum überprüfen auf Updates.
    $IMG = GUICtrlCreatePic(@AppDataDir & "\.minecraft\Splash.jpg", 0, 0, 400, 230, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) ;- Erstellt das Hintergrundbild für die GUI.
    $DL_PROG = GUICtrlCreateProgress(16, 173, 369, 25) ;- Progressbar für den Download.
    $DL_LAB = GUICtrlCreateLabel("", 24, 204, 100, 12) ;- Label für den Download.
    GUISetState(@SW_SHOW)

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

    ;====Variable====;
    $ServerINI = @TempDir & "\serverversion.ini"
    $LocalINI = @AppDataDir & "\.minecraft\Version.ini"
    $upd_url = IniRead($LocalINI, "File", "URL", "")
    $sString = BinaryToString(InetRead('http://46.4.146.40/minecraft/updates/serverversion.ini'))
    $hFile = FileOpen($ServerINI, 2)
    FileWrite($hFile, $sString)
    FileClose($hFile)
    FileDelete($hFile)
    $Ini1 = IniRead($ServerINI, "Update", "VERSION", "")
    $Ini2 = IniRead($LocalINI, "Update", "VERSION", "")
    $url = IniRead($ServerINI, "File", "URL", "")
    $name = IniRead($ServerINI, "File", "NAME", "")
    $size = InetGetSize($url & $name)

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

    ;====Funktionen====;
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $START
    _startcheck()
    Case $UPDATE
    _updatecheck()
    EndSwitch
    WEnd

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

    Func _run()
    If Not @error Then
    $NAME = GUICtrlRead($NAME_INPUT)
    $PASS = GUICtrlRead($PASSWORD_INPUT)
    $IP = GUICtrlRead($IP_INPUT)
    $PASS_READ = IniRead(@AppDataDir & "\.minecraft\Launcher.ini", "Config", "PASS", "")
    ShellExecute(@AppDataDir & "\.minecraft\Minecraft.exe", $NAME & " " & $PASS_READ & " " & $IP) ;- Startet die Datei "Minecraft.exe" mit den folgenden Parametern, $NAME_READ, $PASS_READ und $IP_READ.
    If Not @error Then
    IniWriteSection(@AppDataDir & "\.minecraft\Launcher.ini", "Config", "NAME=" & GUICtrlRead($NAME_INPUT) & @LF & "PASS=" & GUICtrlRead($PASSWORD_INPUT) & @LF & "IP=" & GUICtrlRead($IP_INPUT)) ;- Schreit $NAME_INPUT, $PASSWORD_INPUT und $IP_INPUT in die INI.
    Exit
    EndIf
    EndIf
    EndFunc

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

    Func _updatecheck()
    If $Ini1 <> $Ini2 Then
    $iMsgBoxAnswer = MsgBox(52, "Aktualisierung gefunden!", "Es wurde eine Aktualisierung gefunden." & @CRLF & "Möchten Sie diese herunterladen?")
    Select
    Case $iMsgBoxAnswer = 6
    $download = InetGet($url & $name, $name, 1, 1)
    Do
    $info = InetGetInfo($download, 0)
    $percent = (100 / $size) * $info
    GUICtrlSetData($DL_PROG, $percent)
    $Old = GUICtrlRead($DL_LAB)
    $New = "Geladen:" & Round(($info / 1024) / 1024, 1) & " / " & Round(($size / 1024) / 1024, 1) & "MB"
    If $Old <> $New Then GUICtrlSetData($DL_LAB, $New)
    Until $percent >= 100
    IniWrite ($LocalINI, "Update", "VERSION", $Ini1)
    Case $iMsgBoxAnswer = 7
    Exit
    EndSelect
    EndIf
    EndFunc ;==>_updatecheck

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

    Func _startcheck()
    If $Ini1 <> $Ini2 Then
    MsgBox(48,"Version nicht aktuell!","Ihre Version ist nicht aktuell." & @CRLF & "Bitte aktualisieren sie ihren Clienten.")
    ElseIf $Ini1 = $Ini2 Then
    _run()
    EndIf
    EndFunc ;==>_startcheck

    [/autoit]
  • Seperate Update.exe oder über temporäres Batch Script, welches nach dem Download die download.exe killt und mit der neuen ersetzt.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Wenn ich das richtig verstanden habe also:

    Launcher.exe wird gestartet > Button wird geklickt > Updater.exe wird gestartet > Launcher.exe geschlossen > Download wird begonnen > Download fertig > Alte Launcher.exe wird überschrieben.

    oder?

  • Kannst es auch so machen:

    Launcher.exe wird gestartet > Button wird geklickt > Launcher.exe läd das update runter als Lauchnerupdat.exe > Launcher.exe wird geschlossen > Update.exe löscht Lauchner.exe > Update.exe bennent Lauchnerupdat.exe in Launcher.exe um > Update.exe startet Lauchner.exe

    hat den Vorteil, dass wenn der Download fehlschlägt die ursprüngliche Launcher.exe noch existiert.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Habe es nun so gemacht.

    Updatecheck und Download

    [autoit]

    Func _updatecheck()
    If $Ini1 <> $Ini2 Then
    $iMsgBoxAnswer = MsgBox(52, "Aktualisierung gefunden!", "Es wurde eine Aktualisierung gefunden." & @CRLF & "Möchten Sie diese herunterladen?")
    Select
    Case $iMsgBoxAnswer = 6
    $download = InetGet($url & $NAME, $NAME, 1, 1)
    Do
    $info = InetGetInfo($download, 0)
    $percent = (100 / $size) * $info
    GUICtrlSetData($DL_PROG, $percent)
    $Old = GUICtrlRead($DL_LAB)
    $New = "Geladen:" & Round(($info / 1024) / 1024, 1) & " / " & Round(($size / 1024) / 1024, 1) & "MB"
    If $Old <> $New Then GUICtrlSetData($DL_LAB, $New)
    Until $percent >= 100
    IniWrite($LocalINI, "Update", "VERSION", $Ini1)
    Run (@AppDataDir & "\.minecraft\Update.exe")
    Exit
    Case $iMsgBoxAnswer = 7
    Exit
    EndSelect
    EndIf
    EndFunc

    [/autoit]

    Update.exe

    [autoit]

    Sleep (1000)

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

    FileCopy (@AppDataDir & "\.minecraft\Launcher_New.exe", @AppDataDir & ".minecraft\Launcher.exe")
    FileDelete (@AppDataDir & "\.minecraft\Launcher_New.exe")

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

    Sleep (1000)

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

    Run (@AppDataDir & "\.minecraft\Launcher.exe")

    [/autoit]

    ~EDIT~
    Habe es nun so gemacht.

    [autoit]

    FileDelete (@AppDataDir & "\.minecraft\Launcher.exe")
    FileCopy (@AppDataDir & "\.minecraft\Launcher_New.exe", @AppDataDir & "\.minecraft\Launcher.exe")

    [/autoit]

    Danke für deine Hilfe, Chip.

    Einmal editiert, zuletzt von Kazuto (13. März 2011 um 11:16)