Programm soll rückgabe von einem anderen erhalten

  • Hallo...

    Ich stehe vor folgender Frage:

    Ich möchte gerne 2 Programme programmieren, die folgendes tun:

    Programm1 Startet Programm2 und gibt sowas wie einen return.
    Programm2 soll also nicht wirklich zu sehen sein, nur einen return geben und sich direkt wieder beenden.
    Ich habe schon dran gedacht dass Programm1 nen TCPListen macht, programm2 dann kurz was sendet und direkt wieder verschwindet, aber ich bin mir sicher das geht auch einfacher ^^
    Jemand ne lösung?


    Eigentliches Problem ist:
    Updater. Ich möchte nen Updater programmieren.
    Nun möchte ich aber nicht, dass irgendwer in ner version.txt rumfuscht, deswegen soll der Updater.exe das programm mit parameter /getversion oderso aufrufen, und das programm soll dann nur $version an den Updater zurückgeben. das mit den Parametern werd ich hinbekommen, aber das zurückgeben des strings, wie mache ich das am besten?

  • 1. Programm startet 2.Programm mit Run und lässt die PID zurückgeben.
    Programm 2 schreibt am Ende den Returnwert per ConsoleWrite.
    Programm 1 liest nun mit StdOutRead die Console von Programm 2 aus und wartet bis ein Wert zurückkommt.

    Beispiel:

    Programm1:

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>

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

    $PID = Run("Programm2.exe", "", "", $STDERR_CHILD + $STDOUT_CHILD)
    Do
    $Read = StdOutRead($PID)
    Until $Read <> ""
    MsgBox(0, "", $Read)

    [/autoit]

    Programm2:

    Spoiler anzeigen
    [autoit]

    $Ergebnis = 12 + 7
    ConsoleWrite($Ergebnis & @CRLF)

    [/autoit]
  • ich habs jetzt mal so versucht:

    Updater:

    [autoit]

    if FileExists("QSU.exe") then
    TCPStartup()
    $listen = TCPListen("127.0.0.1", 18274)
    Run("QSU.exe getversion")
    $con = -1
    Do
    $con = TCPAccept($listen)
    Until $con <> -1
    $recv = ""
    Do
    $recv &= TCPRecv($con, 64)
    Until @error
    msgbox(0, "", $recv)
    endif

    [/autoit]


    QSU:

    [autoit]

    if $CmdLine[1] = "getVersion" Then
    Local $con
    TCPStartup()
    $con = TCPConnect("127.0.0.1", 18274)
    TCPSend($con, $version)
    Sleep(100)
    TCPCloseSocket($con)
    TCPShutdown()
    Exit
    endif

    [/autoit]

    warum bekomm ich nix zurück?

  • Hab mit TCP bisher nicht gearbeitet,
    aber bei QSU machst du ein TCPStartup()! Das sollte doch nur beim Server so sein.
    Updater (ist der Server) -> Hier TCPStartup()
    QSU (ist der Client) -> KEIN TCPStartup()

    Oder hab ich das falsch verstanden?

    Edit:


    Nein ^^
    TCP Starten muss man IMMER
    Nur beim server HÖRT man dann (TCPListen) und der Client verbindet (TCPConnect)


    Aha 8)

    Einmal editiert, zuletzt von Cyberdyne (12. November 2010 um 16:46)

  • Hab mit TCP bisher nicht gearbeitet,
    aber bei QSU machst du ein TCPStartup()! Das sollte doch nur beim Server so sein.
    Updater (ist der Server) -> Hier TCPStartup()
    QSU (ist der Client) -> KEIN TCPStartup()

    Oder hab ich das falsch verstanden?


    Nein ^^
    TCP Starten muss man IMMER
    Nur beim server HÖRT man dann (TCPListen) und der Client verbindet (TCPConnect)

    Edit: Beispiel von Pinguin94 funktioniert wunderbar

  • Warum so kompliziert? Wenn wirklich nur die Versionsnummer ausgelesen werden soll kann man das auch erreichen ohne das Programm zu starten, das geupdated werden soll.

    [autoit]


    $file = "C:\test.exe"
    $version = FileGetVersion($file,"FileVersion")
    MsgBox(0,"Version",$version)

    [/autoit]

    Funktioniert natürlich nur wenn beim kompilieren eine Datei-Version angegeben wurde, bzw. im Headbereich des Quellcodes eingetragen ist:

    [autoit]


    #AutoIt3Wrapper_Res_Fileversion=0.7.4.8

    [/autoit]
  • Wieso nicht so? :
    Prog1:

    [autoit]

    MsgBox(0, "", ShellExecuteWait("prog2.exe"))

    [/autoit]

    Prog2.exe :

    [autoit]

    $returnValue=2
    Exit $returnValue

    [/autoit]


    Genau das hab ich gesucht ^^
    aber das andere klappt jetzt, also lass ich das erstmal

  • Nett. Wusste garnicht dass sowas auch geht, man lernt scheinbar nie aus. Nachteil ist aber, dass der Exitcode nur eine Integerzahl sein kann (laut Hilfe). Ein Versionsstring wie "0.7.1.2" oder ähnliches wäre also mit dieser Methode nicht möglich bzw. müsste umformatiert werden.

  • Da ich bisher nicht mit TCP gearbeitet habe, habe ich mich gleich dran versucht :D

    Hier mein Skript dazu:

    Server
    [autoit]


    Opt('MustDeclareVars', 1)

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

    MsgBox(64, "Server()", Server())

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

    Func Server()
    Local $IP = @IPAddress1, _
    $Port = 18274, _
    $Socket = -1, _
    $Connection = -1, _
    $recv = ""

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

    TCPStartup()
    ;Warte auf Server
    $Socket = TCPListen($IP, $Port)
    If $Socket = -1 Then MyExit()
    ;Warte auf Client
    Do
    Sleep(100)
    $Connection = TCPAccept($Socket)
    Until Not ($Connection = -1)
    ;Warte auf Daten
    Do
    Sleep(100)
    $recv = TCPRecv($Connection, 2048)
    Until Not ($recv = "")
    If Not ($Connection = -1) Then TCPCloseSocket($Connection)
    TCPShutdown()
    Return $recv
    EndFunc

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

    Func MyExit()
    MsgBox(4112, "Error", "Couldn't connect to server!")
    Exit
    EndFunc

    [/autoit]
    Client
    [autoit]

    Opt('MustDeclareVars', 1)

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

    Client()

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

    Func Client()
    Local $IP = @IPAddress1, _
    $Port = 18274, _
    $Connection = -1, _
    $send = "Data was send"

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

    TCPStartup()
    ;Verbinde mit Server
    $Connection = TCPConnect($IP, $Port)
    If @error Then MyExit()
    ;Sende Daten an Server
    TCPSend($Connection, $send)
    If Not ($Connection = -1) Then TCPCloseSocket($Connection)
    TCPShutdown()
    EndFunc

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

    Func MyExit()
    MsgBox(4112, "Error", "Couldn't connect to server!")
    Exit
    EndFunc

    [/autoit]