Fehlermeldung bei Start der kompilierten EXE

  • Hallo Forum,
    hab hier ein Problem für Spezialisten (oder ich bin zu doof ?( ). Ich kompiliere meine Scripte mit folgenden Einstellungen:

    Spoiler anzeigen


    #AutoIt3Wrapper_Icon=image\main.ico
    #AutoIt3Wrapper_Outfile=..\..\..\..\GerdE\Eigene Programme\shutdown.exe
    #AutoIt3Wrapper_Outfile_x64=..\..\..\..\GerdE\Eigene Programme\64bit\shutdown_x64.exe
    #AutoIt3Wrapper_Compile_Both=y
    #AutoIt3Wrapper_UseX64=y
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #Au3Stripper_Parameters=/sf /sv /soi

    Mit diesen Einstellungen werden keine Fehler angezeigt. Wenn ich jetzt aber die EXE starte, kommt folgender Fehler:

    Jetzt das Kuriose - nach dem zweiten oder dritten Versuch startet das Programm dann aber ohne Fehlermeldung. und auch bei der Ausführung wird kein Fehler mehr angezeigt.
    Hat jemand dafür eine Erklärung ????

    Vielen Dank für eure Antworten
    Schmunzel57

  • OK - hier dann mal der Quellcode:

    Spoiler anzeigen


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=image\main.ico
    #AutoIt3Wrapper_Outfile=..\..\..\..\GerdE\Eigene Programme\shutdown.exe
    #AutoIt3Wrapper_Outfile_x64=..\..\..\..\GerdE\Eigene Programme\64bit\shutdown_x64.exe
    #AutoIt3Wrapper_Compile_Both=y
    #AutoIt3Wrapper_UseX64=y
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #Au3Stripper_Parameters=/sf /sv /soi
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; -------------------------------------------------------------------
    ; Dateiname: Shutdown v1.0.au3
    ; AutoIt Version: 3.3.12
    ; Author: GerdE
    ; -------------------------------------------------------------------
    ;
    ;--------------------------------------------------------------------
    ; Includes
    ;--------------------------------------------------------------------
    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <Constants.au3>
    #include <Date.au3>
    #include <DateTimeConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #Include <Misc.au3>
    #include <StaticConstants.au3>
    #include <UpDownConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    ;
    ;------------------------------------------------
    ; Allgemeine Programm-Optionen
    ;------------------------------------------------
    Opt( "MustDeclareVars", 1 )
    Opt( "GUICloseOnESC", 0 )
    ;Opt( "GUIOnEventMode", 1 ) ; Wechsle in den OnEvent Modus
    Hotkeyset('{Esc}','_end')
    ;GUISetOnEvent($GUI_EVENT_CLOSE, '_end')
    ;------------------------------------------------
    ; Grafiken einbinden
    ;------------------------------------------------
    If FileExists(@ScriptDir & "\image") == 0 Then
    DirCreate(@ScriptDir & "\image")
    EndIf
    FileInstall(".\image\logoff.ico", @ScriptDir & "\image\logoff.ico")
    FileInstall(".\image\restart.ico", @ScriptDir & "\image\restart.ico")
    FileInstall(".\image\shutdown.ico", @ScriptDir & "\image\shutdown.ico")
    FileInstall(".\image\standby.ico", @ScriptDir & "\image\standby.ico")
    ;------------------------------------------------
    ; zeitlich wiederkehrende Funktionen
    ;------------------------------------------------
    AdlibRegister("_ticker", 100)
    ;------------------------------------------------
    ; Globale Variablen, auch für GUIs
    ;------------------------------------------------
    Global Const $APP_NAME = "Shutdown v1.0"
    Global $defaultstatus = "Status: Ready"
    Global $sFilePath
    ;------------------------------------------------
    ; Include der GUI(s)
    ;------------------------------------------------
    #include "forms\main_GUI.isf"
    #include "forms\about_GUI.isf"
    ;------------------------------------------------
    ; GUI(s) - Parameter einstellen und starten
    ;------------------------------------------------
    GUICtrlSetData($statuslabel, $defaultstatus)
    GUISwitch($main_GUI)
    GUISetState(@SW_SHOW)
    ;------------------------------------------------
    ; Programm-Variablen deklarieren
    ;------------------------------------------------
    Global $action = -99
    ;------------------------------------------------
    ; Registry-Einträge lesen (falls vorhanden)
    ;------------------------------------------------
    Global $NoTray, $Corner, $Hide, $Trans, $Top, $Resist
    _RegLesen() ; ACHTUNG: Werte müssen vorher als GLOBAL $deklariert werden
    Global $Stunden, $Minuten, $Sekunden
    Global $countdownset = 0
    Global $Zeit, $Startzeit ; $lb_AktZeit,
    ;------------------------------------------------
    ; Init(s) und Funktion(en) vor PGM-Schleife
    ;------------------------------------------------
    If _Singleton(@ScriptName, 1) = 0 Then
    Msgbox(16,"Achtung","Eine Instanz läuft bereits.", 10)
    Exit
    EndIf
    ;
    _main()
    _end()
    ;------------------------------------------------
    ; Programm ENDE
    ;------------------------------------------------
    ;
    ;------------------------------------------------
    ; Beginn Programm-Schleife
    ;------------------------------------------------
    Func _main()
    ; Auswertung der Menu- oder Button-Aufrufe @ProgramsDir
    ; -------------------------------------------------------------------------
    While 1
    Local $nMsg = GUIGetMsg(1) ; extended Modus wichtig!! bei weiteren GUIs
    Switch $nMsg[1] ; für welches Fenster ist die Message
    Case $main_GUI ; ab hier ist Gui1 dran
    Switch $nMsg[0] ; welche Message wurde ausgelöst
    ; -------------------------------------------------------------------------
    ; ENDE auslösen
    ; -------------------------------------------------------------------------
    Case $nMsg[0] = $GUI_EVENT_CLOSE And $nMsg[1] = $main_GUI
    MsgBox(0, "GUI Event", "Programm wirlich beenden ?")
    ExitLoop
    ; -------------------------------------------------------------------------
    ; Menü DATEI
    ; -------------------------------------------------------------------------
    Case $nMsg[0] = $filemenu
    $sFilePath = FileOpenDialog("Bitte Datei auswählen ...", @TempDir, "Alle (*.*)")
    If @error Then
    ContinueLoop
    EndIf
    GUICtrlCreateMenuItem($sFilePath, $recentfilesmenu)
    ; -------------------------------------------------------------------------
    ; Menü STATUSBAR
    ; -------------------------------------------------------------------------
    Case $nMsg[0] = $viewstatusitem
    If BitAND(GUICtrlRead($viewstatusitem), $GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($viewstatusitem, $GUI_UNCHECKED)
    GUICtrlSetState($statuslabel, $GUI_HIDE)
    Else
    GUICtrlSetState($viewstatusitem, $GUI_CHECKED)
    GUICtrlSetState($statuslabel, $GUI_SHOW)
    EndIf
    ; -------------------------------------------------------------------------
    ; Radio SOFORT
    ; -------------------------------------------------------------------------
    Case $nMsg[0] = $sofort
    GUICtrlSetState($Input_stunden, $GUI_DISABLE)
    GUICtrlSetState($Input_minuten, $GUI_DISABLE)
    GUICtrlSetState($Input_sekunden, $GUI_DISABLE)
    ; -------------------------------------------------------------------------
    ; Radio UHRZEIT
    ; -------------------------------------------------------------------------
    Case $nMsg[0] = $uhrzeit
    GUICtrlSetState($Input_stunden, $GUI_ENABLE)
    GUICtrlSetState($Input_minuten, $GUI_ENABLE)
    GUICtrlSetState($Input_sekunden, $GUI_ENABLE)
    GUICtrlSetData($Input_stunden, @HOUR)
    GUICtrlSetData($Input_minuten, @MIN)
    GUICtrlSetData($Input_sekunden, @SEC)
    ; -------------------------------------------------------------------------
    ; Input STUNDEN, MINUTEN, SEKUNDEN
    ; -------------------------------------------------------------------------
    Case $nMsg[0] = $Input_stunden
    If GUICtrlRead($Input_stunden) > 24 Then GUICtrlSetData($Input_stunden, 0)
    If GUICtrlRead($Input_stunden) < 0 Then GUICtrlSetData($Input_stunden, 23)
    Case $nMsg[0] = $Input_minuten
    If GUICtrlRead($Input_minuten) > 59 Then GUICtrlSetData($Input_minuten, 0)
    If GUICtrlRead($Input_minuten) < 0 Then GUICtrlSetData($Input_minuten, 59)
    Case $nMsg[0] = $Input_sekunden
    If GUICtrlRead($Input_sekunden) > 59 Then GUICtrlSetData($Input_sekunden, 0)
    If GUICtrlRead($Input_sekunden) < 0 Then
    GUICtrlSetData($Input_minuten, 59)
    GUICtrlSetData($Input_sekunden, 0)
    EndIf
    ; -------------------------------------------------------------------------
    ; Button START
    ; -------------------------------------------------------------------------
    Case $nMsg[0] = $startbutton
    ; was soll ausgeführt werden
    if GUICtrlRead($rRestart) = $GUI_CHECKED then $action = 2
    if GUICtrlRead($rShutdown) = $GUI_CHECKED then $action = 8
    if GUICtrlRead($rStandby) = $GUI_CHECKED then $action = 64
    if GUICtrlRead($rLogoff) = $GUI_CHECKED then $action = 0
    ;
    GUICtrlSetState($startbutton, $GUI_DISABLE)
    GUICtrlSetData($cancelbutton, "S T O P P E N")
    GUICtrlSetBkColor($cancelbutton, 0xF59898)
    ;
    If GUICtrlRead($Sofort) = 1 Then
    $countdownset = 1
    $Stunden = @HOUR
    $Minuten = @MIN
    $Sekunden = @SEC + 10
    ;$Zeit = "500"
    $Zeit = (($Sekunden) + ($Minuten)*60 + ($Stunden)*3600)
    ;MsgBox(0, "Meldung", "Shutdown 2 in " & $Zeit & " Sekunden")


    ElseIf GUICtrlRead($uhrzeit) = 1 Then
    $Stunden = GUICtrlRead($Input_stunden)
    $Minuten = GUICtrlRead($Input_minuten)
    $Sekunden = GUICtrlRead($Input_sekunden)
    $countdownset = 1
    ;
    ;$Startzeit = GUICtrlRead($Sekunden)
    $Zeit = (GUICtrlRead($Sekunden) + GUICtrlRead($Minuten)*60 + GUICtrlRead($Stunden)*3600)
    ;MsgBox(0, "Meldung", "Shutdown 2 in " & $Zeit & " Sekunden")
    ;_makeit($action, $Zeit)
    Else
    MsgBox(0, "Meldung", "Watt iss en jetzt loos.")
    EndIf
    ; -------------------------------------------------------------------------
    ; Button ABBRECHEN
    ; -------------------------------------------------------------------------
    Case $nMsg[0] = $cancelbutton
    if $countdownset = 1 Then
    GUICtrlSetState($startbutton, $GUI_ENABLE)
    GUICtrlSetData($cancelbutton, "Beenden")
    GUICtrlSetBkColor($cancelbutton, 0xFFFFFF)
    MsgBox(0, "ABBRUCH", "Ausführung durch User abgebrochen.")
    GUICtrlSetData($statuslabel, $defaultstatus)
    $countdownset = 0
    Else
    _end()
    EndIf
    ; -------------------------------------------------------------------------
    ; Menu - Info-Fenster anzeigen
    ; -------------------------------------------------------------------------
    Case $nMsg[0] = $infoitem
    GUISetState(@SW_SHOW, $about_GUI) ; Gui2 anzeigen
    GUISetState(@SW_DISABLE, $main_GUI) ; Gui1 für disablen

    ; ***** Ende Case Abfragen GUI1 -------------------------------------------
    EndSwitch
    Case $about_GUI ; ab hier ist Gui2 dran
    Switch $nMsg[0] ; welche Message wurde ausgelöst
    Case $btnGUI2ok, $GUI_EVENT_CLOSE
    GUISetState(@SW_ENABLE, $main_GUI) ;Gui1 für ensablen
    GUISetState(@SW_HIDE, $about_GUI) ;Gui2 verstecken
    EndSwitch
    EndSwitch
    WEnd
    EndFunc ; _main()

    Func _CreateGui2()
    ;$zeit_GUI = GUICreate("Form1", 230, 80, 1360, 750, -1, -1, $main_GUI) ;wichtig ist der letzte Parameter
    ;$Com = GUICtrlCreateLabel("computer wird in ", 8, 14, 84, 17)
    ;$Her = GUICtrlCreateLabel("Label2", 92, 14, 124, 17)
    ;$Abbrechen = GUICtrlCreateButton("Abbrechen", 88, 48, 75, 25, 0)
    EndFunc ;==>_CreateGui2

    Func _makeit($sTyp)
    ; Erweiterung --> Func _makeit($sTyp, $sZeit)
    ;
    ; 0 = Logoff - Logs off current user (doesn't close programs)
    ; 1 = Shutdown - Shutsdown computer (doesn't close programs)
    ; 2 = Reboot - Restarts computer (doesn't close programs)
    ; 4 = Force - Forces programs to close
    ; 8 = Power down - This action physically powers off computer. (Hardware must support this)
    ; 16= Force if hung - Will force the action no matter what is stopping computer from shuting down
    ; 32= Standby - Sleep Mode
    ; 64= Hibernate - For laptops usally (hardware must support this as well)
    ;
    ;MsgBox(0, "Meldung", "Typ = " & $sTyp & @CRLF & "Zeit = " & $sZeit)
    Shutdown ($sTyp)
    _end()
    EndFunc

    Func _ticker()
    Local $jetzt = _NowTime(5)
    If GUICtrlRead($lb_AktZeit) <> $jetzt Then
    GUICtrlSetData($lb_AktZeit, $jetzt) ; Wirkt Flackern entgegend (gleicht vorher den alten mit dem neuen Wert ab)
    EndIf
    If $countdownset = 1 Then
    Local $countdown = _countdown($Stunden, $Minuten, $Sekunden)
    GUICtrlSetData($statuslabel, "Countdown: " & _Sec2Time($countdown))
    If $countdown <= 0 Then
    ;_Was_auch_immer_du_tun_willst_wenn_der_Zeitpunkt_da_ist()
    ;_makeit($action, $Zeit)
    _makeit($action)
    $countdownset = 0
    EndIf
    EndIf
    EndFunc

    Func _countdown($h, $m, $s)
    Return _DateDiff("s", _NowCalc(), @YEAR & "/" & @MON & "/" & @MDAY & " " & $h & ":" & $m & ":" & $s)
    EndFunc ;==>_countdown

    Func _Sec2Time($nr_sec)
    Local $sec2time_hour = Int($nr_sec / 3600)
    Local $sec2time_min = Int(($nr_sec - $sec2time_hour * 3600) / 60)
    Local $sec2time_sec = $nr_sec - $sec2time_hour * 3600 - $sec2time_min * 60
    Return StringFormat('%02d:%02d:%02d', $sec2time_hour, $sec2time_min, $sec2time_sec)
    EndFunc ;==>Sec2Time

    Func _RegLesen()
    ; Global $NoTray, $Corner, $Hide, $Trans, $Top, $Resist
    ;_writeLog("* Registry wird gelesen.", 1)
    $NoTray = RegRead("HKCU\Software\Ellisoft\Shutdown", "No_Tray")
    $Corner = RegRead("HKCU\Software\Ellisoft\Shutdown", "Corner")
    $Hide = RegRead("HKCU\Software\Ellisoft\Shutdown", "Hide_Window")
    $Trans = RegRead("HKCU\Software\Ellisoft\Shutdown", "Transparence")
    $Top = RegRead("HKCU\Software\Ellisoft\Shutdown", "On_Top")
    $Resist = RegRead("HKCU\Software\Ellisoft\Shutdown", "Resisstant")
    ;GUICtrlSetData($iInDir, $regInputDir)
    ;GUICtrlSetData($iOutDir, $regOutputDir)
    ;If ($regInputDir == "") Or ($regOutputDir == "") Then
    ; MsgBox(262192,"Registry auslesen","Bitte zuerst die standardmäßigen INPUT- und " _
    ; & "OUTPUT- Ordner festlegen.", 0)
    ;EndIf
    EndFunc

    Func _RegSchreiben()
    ; Global $NoTray, $Corner, $Hide, $Trans, $Top, $Resist
    ;_writeLog("* Registry wird geschrieben.", 1)
    RegWrite("HKCU\Software\Ellisoft\Shutdown", "No_Tray", "REG_DWORD", $NoTray)
    RegWrite("HKCU\Software\Ellisoft\Shutdown", "Corner", "REG_DWORD", $Corner)
    RegWrite("HKCU\Software\Ellisoft\Shutdown", "Hide_Window", "REG_DWORD", $Hide)
    RegWrite("HKCU\Software\Ellisoft\Shutdown", "Transparence", "REG_DWORD", $Trans)
    RegWrite("HKCU\Software\Ellisoft\Shutdown", "On_Top", "REG_DWORD", $Top)
    RegWrite("HKCU\Software\Ellisoft\Shutdown", "Resisstant", "REG_DWORD", $Resist)
    EndFunc

    Func _end()
    ;------------------------------------------------
    ; Temporäre Images wieder löschen
    ;------------------------------------------------
    ;FileDelete(@ScriptDir & "\image\Schmunzel.jpg")
    ;FileDelete(@ScriptDir & "\image\main.ico")
    ;FileDelete(@ScriptDir & "\image\logoff.ico")
    ;FileDelete(@ScriptDir & "\image\restart.ico")
    ;FileDelete(@ScriptDir & "\image\shutdown.ico")
    ;FileDelete(@ScriptDir & "\image\standby.ico")
    ;------------------------------------------------
    ; GUI(s) löschen
    ;------------------------------------------------
    ; GUIDelete($zeit_GUI) ; das wäre das 2. Fenster
    GUIDelete($about_GUI)
    GUIDelete($main_GUI)
    ;------------------------------------------------
    ; Sonstige Handles löschen
    ;------------------------------------------------
    AdlibUnRegister("_ticker")
    ;
    Exit
    EndFunc

  • Wenn ich dein Skript, nach auskommentieren der beiden fehlenden *GUI.isf, mit F5 starte bekomme ich 20 Errors. Dies liegt wohl daran das alle globalen Variablen in einem der beiden Files deklariert sind. Du solltest also diese mit einstellen, denn ohne kann man nicht testen.

    Edit: nimm einmal die Zeile

    Code
    #AutoIt3Wrapper_Run_Au3Stripper=y

    heraus bzw. setze die Anweisung auf n. Vieleicht löscht der Au3Stripper ja zuviel was afaik nur bei Objekten vorkommt.

  • Das Problem liegt sehr wahrscheinlich hier:

    AutoIt
    ;------------------------------------------------
    ; zeitlich wiederkehrende Funktionen
    ;------------------------------------------------
    AdlibRegister("_ticker", 100)

    Die Funktion "_ticker" wird ab dieser Stelle alle 100ms aufgerufen. Sollte vor dem ersten Aufruf der Funktion die GUI bzw. eine in der Funktion aufgerufene/genutzte globale Variablen noch nicht deklariert worden sein stürzt das Script ab.
    Du solltest den Adlibregister Aufruf also frühestens dann machen wenn alle Globalen Deklarationen erfolgt sind die in dieser Funktion relevant sein könnten.