Programm per StdOutRead in GUI einlesen. Funktioniert nicht ?!

  • Hey Leute,

    habe immernoch das selbe Problem wie vor einigen Monaten. Langsam glaube ich zu wissen wo mein Problem liegt.

    Ich habe ein Programm, dass wie ein DOS Fenster aussieht, wenn man es öffnet. Aber ich glaube mittlerweile, dass es das nicht ist :D Ich bekam über keinen möglichen Weg den StdOut kram ausgelesen. Außer, wenn das Programm ein Fehler ausgibt.

    Es handelt sich dabei um ein Server Programm, welches ein Fehler verursacht "Cannot bind on 0.0.0.0:8085" sobald man es ein zweites mal öffnet. ist ja klar. der server kann ja nicht ein zweites mal den selben port benutzen.

    diese ausgabe konnte ich auslesen. Die Ausgabe jedoch welche bei einem erfolgreichem start angezeigt wird kann ich jedoch nicht auslesen.

    kann es sein dass man nur StdOutRead nutzen kann, wenn auch folgendes in einer CMD box zum erfolg führt? "Programm.exe >> Textdatei.txt". mit diesem befehl stand wieder nur der fehlerbericht in der textdatei aber nicht der erfolgreiche start :/

    das nervt mich langsam echt so sehr :D kann doch nicht sein. nutzt es vlt eine ausgabe pipe die autoit nicht auf den schirm bekommt?

    Würde mich über nähere infos freuen :)

  • Man muss unterscheiden zwischen StderrRead und StdoutRead, anscheinend schreibt das Programm die Fehler auf den StdOut.

    Probier in der Console mal das: "Programm.exe >> Textdatei.txt 2>&1"

    jap so klappt es. das programm wird anscheinend ausgeführt ohne in der Konsole etwas anzuzeigen, wenn ich dann den vorgang mit STRG+C abbreche stehen alle infos in der datei ;) Das heißt jz genau was? :)

  • [autoit]


    $pid = Run("authserver.exe", "" ,@SW_SHOW, $STDOUT_CHILD + $STDERR_CHILD)
    Local $text, $text2

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btEnd
    Exit
    EndSwitch
    $text = StdoutRead($pid);
    $text2 = StderrRead($pid);
    IF Not StringCompare($text, GUICtrlRead($editAuth)) = 0 Then
    GUICtrlSetData($editAuth, $text)
    EndIf
    IF Not StringCompare($text2, GUICtrlRead($editWorld)) = 0 Then
    GUICtrlSetData($editWorld, $text2)
    EndIf
    Sleep(20)
    WEnd

    [/autoit]


    Das StringCompare habe ich nur drin, weil der mir den StandartText aus dem EDIT rauslöscht ohne was reinzuschreiben. Hatte auch gedacht, dass er ggf beim ersten mal alles aus dem Stream liest und danach wieder mit null füllt wenn sich nix ändert. aber leider klappt es so auch nicht!

    Habe hier noch 2 Bilder die genau zeigen, dass der Stream ausgelesen wird aber nicht da bleibt.

    - Ich starte mein Skript, welches dann diese Authserver.exe startet. -> Nichts wird in den EDIT geschrieben
    - Ich lasse den Authserver.exe an aber schließe mein Skript
    - Ich starte mein Skript neu -> Für einen Bruchteil einer Sekunde kann man sehen dass der Stream ausgelesen wird!!!

    Hier die Bilder:

    [Blockierte Grafik: http://i.imagebanana.com/img/7gxz21mu/Start1.jpg]

    [Blockierte Grafik: http://i.imagebanana.com/img/wlwl2upc/Start2.jpg]


    PS: Es geht mir halt darum, diesen Server-Daemon zu verstecken und nur noch in meiner GUI anzuzeigen, und ggf sogar Befehle aus einem Input in der GUI an den Server Daemon zu schicken.

  • Hab mal einen kleinen Test gemacht. Das funktioniert einwandfrei und wie erwartet. Vielleicht hilft dir das ja weiter.
    Hier die Skripts:

    Console-Programm
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #NoTrayIcon

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

    For $i = 1 to 10
    ConsoleWrite("Write to StdOut: " & $i & @CRLF)
    ConsoleWriteError("Write to StdErr: " & $i & @CRLF)
    Sleep(2000)
    Next

    [/autoit]

    [spoilerConsole-Test-Programm]

    [autoit]

    #include "Constants.au3"

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

    Global $sErr, $sOut
    Global $sExe = "Console-Progreamm.exe"

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

    Global $iPID = Run($sExe, "", @SW_SHOW, $STDOUT_CHILD + $STDERR_CHILD)
    While ProcessExists($sExe)
    $sErr = StderrRead($iPID)
    $sOut = StdoutRead($iPID)
    If $sErr <> "" Then ConsoleWrite("Vom StdErr gelesen: " & $sErr)
    If $sOut <> "" Then ConsoleWrite("Vom StdOut gelesen: " & $sOut)
    WEnd

    [/autoit]

    [/spoiler]

    Außerdem: Schau dir mal den zweiten Parameter von GUICtrlSetData() an. ;)

  • dein testprogramm funktioniert. aber mit meinem server nicht :/ was ist denn an meinem GUICtrlSetData() falsch?

    EDIT: jz wirds crazy :D

    also! eigentlich sind es sogar zwei server. der Login server und der game server. der login server gibt nur etwas raus wenn er ein fehler anzeigt da er schon läuft. der gameserver funktioniert mit der ganz normalen STDout wie ich gerade sehe ;)

    EDIT2:

    zu früh gefreut. der gameserver kackt ab nachdem er geladen hat, wenn ich im RUN befehl den prozess zum child prozess mache ;)

    3 Mal editiert, zuletzt von Squizzy (28. Juni 2013 um 16:43)