Returnwert an DosBox senden

  • Gibt es eine möglichkeit, das wenn ich ein script über die Dosbox starte es mir einen Rückgabewert gibt? also das in der Dosbox etwas steht Datei nicht gefunden etc. ? Ich will meinem Prog einen Parameter übergeben wenn dieser nicht stimmt soll er etwas reinschreiben.

    • Offizieller Beitrag

    Ich glaube Du hast das falsch verstanden, @Tam0r will das sein, mit AutoIt geschiebenes, Programm etwas in der DosBox ausgibt. So wie der Befehl printf oder cout in C/C++.

  • Hallo,

    da wir im Geschäft noch mit einer DOS-Auftragsbearbeitung arbeiten, und ich schon viele Schnittstellen erstellt habe, interessiert mich dieses Thema auch immer wieder.

    Aber ich denke auch nicht dass es eine Möglichkeit gibt Daten zurück an das DOS-Programm zu schicken. In einer Lösung konnte ich das DOS-Programm dazu anhalten nach einer Datei 'Ausschau' zu halten, welche von AutoIT erstellt wurde. Das ist aber dann eine 'normale' Import-Funktion.

    Wenn es nur darum geht eine Meldung auszugeben, so kann ja vielleicht einfach ein Fenster davor gesetzt werden. Ein Screenshot-Skript (siehe hier im Forum) bei der Markierung macht das ja ganz pfiffig.

    Viele Grüße
    Carsten

  • Hallo,

    ich habe mir das auch mal näher angeschaut. Dieses Script (siehe Link von peethebee, Beispiel 1 aus den Auto3Lib, Bereich 'Pipes') ist halt doch höhere AutoIt-Programmierkunst :)

    Jedenfalls kapier ich nicht viel und funktionieren tut es auch nicht.


    Spoiler anzeigen
    [autoit]


    #include <A3LPipes.au3>
    #include <A3LWinAPI.au3>

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

    Opt("MustDeclareVars", 1)

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

    ; ===============================================================================================================================
    ; Description ...: Shows how to use pipe functions to read the output from a console operation
    ; Author ........: Paul Campbell (PaulIA)
    ; Notes .........: This script MUST be run in SciTE in order to see the results
    ; ===============================================================================================================================

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

    ; ===============================================================================================================================
    ; Main
    ; ===============================================================================================================================

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

    ExecuteCmd("cmd.exe /c dir c:\windows")
    ;ExecuteCmd("ping https://autoit.de/www.autoit.com")

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

    ; ===============================================================================================================================
    ; Execute a command and display the results
    ; ===============================================================================================================================
    Func ExecuteCmd($sCmd)
    Local $iBytes, $sData, $hReadPipe, $hWritePipe, $tBuffer, $tProcess, $tSecurity, $tStartup

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

    ; Set up security attributes
    $tSecurity = DllStructCreate($tagSECURITY_ATTRIBUTES)
    DllStructSetData($tSecurity, "Length" , DllStructGetSize($tSecurity))
    DllStructSetData($tSecurity, "InheritHandle", True)

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

    ; Create a pipe for the child process's STDOUT
    _Pipe_CreatePipe($hReadPipe, $hWritePipe, $tSecurity)

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

    ; Create child process
    $tProcess = DllStructCreate($tagPROCESS_INFORMATION)
    $tStartup = DllStructCreate($tagSTARTUPINFO)
    DllStructSetData($tStartup, "Size" , DllStructGetSize($tStartup))
    DllStructSetData($tStartup, "Flags" , BitOR($STARTF_USESTDHANDLES, $STARTF_USESHOWWINDOW))
    DllStructSetData($tStartup, "StdOutput", $hWritePipe)
    DllStructSetData($tStartup, "StdError" , $hWritePipe)
    _API_CreateProcess("", $sCmd, 0, 0, True, 0, 0, "", DllStructGetPtr($tStartup), DllStructGetPtr($tProcess))
    _API_CloseHandle(DllStructGetData($tProcess, "hProcess"))
    _API_CloseHandle(DllStructGetData($tProcess, "hThread" ))

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

    ; Close the write end of the pipe before reading from the read end of the pipe
    _API_CloseHandle($hWritePipe)

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

    ; Read data from the child process
    $tBuffer = DllStructCreate("char Text[4096]")
    while 1
    _API_ReadFile($hReadPipe, DllStructGetPtr($tBuffer), 4096, $iBytes)
    if $iBytes = 0 then ExitLoop
    $sData = StringLeft(DllStructGetData($tBuffer, "Text"), $iBytes)
    $sData = StringReplace($sData, @CR & @CR, @CR)
    ConsoleWrite($sData)
    wend
    EndFunc

    [/autoit]


    Ich bekomme folgende Fehlermeldung:
    >Running:3.2.2.0:C:\Programme\AutoIt3\autoit3.exe "C:\Programme\AutoIt3\Auto3Lib\Pipes\Console.au3"
    C:\Programme\AutoIt3\Include\A3LPipes.au3 (233) : ==> AutoIt has encountered a fatal crash as a result of:
    Unable to execute DLLCall.:
    $aResult = DllCall("Kernel32.dll", "int", "CreatePipe", "ptr", DllStructGetPtr($tPipes, "Read"), "ptr", DllStructGetPtr($tPipes, "Write"), "ptr", $pSecurity, "uint", $iSize)
    +>AutoIT3.exe ended.rc:0

    Aber ich brauche hier auch keine Lösung, denn ich weiß momentan gar nicht wie ich das hier einsetzen könnte.... Ich wollte einfach nur meine kleine Erfahrung hiermit zum Besten geben.....