Jump to content

Odd problem with stdinwrite


Recommended Posts

OK so i'm trying to build a tool part of which adds a GUI to a command line tool.  my tests seemed to work fine but when i ported my function into a GUI they break, the first time i invoke the commandline it returns nothing, then each subsequent time i press the button that calls to command line it ignores the current command and re-sends the last command. if i press the button a second time the command updates.    IE let's say  i have a command line app with a counter as one of the inputs.


Press button to generate output -> "0" returned
Press Button again with same paramaters -> "Hello world 1" returned

Change counter to "2" press button  -> "Hello world 1" returned

press the button again ->  "Hello world 2" returned
 

THis was boggling my mind so i stripped out the GUI and took the function that was being called in the GUI and make it a hotkey call.   now the exact same code that calls the commandline has different behavior



Press hotkey to generate output -> "0" returned

Press hotkey again with same paramaters -> "Hello world 1" returned

Change counter to "2" press hotkey-> "Hello world 2" returned

 

 

So a hotkey act's "normally" bot only after the initial "0" is returned.

 

if I perform the function call for the command line before the hotkey while loop it functions properly the first time. :   This seems like some sort of autoit bug but i have no idea how to work around it. : example code

 

 

 

#include <Constants.au3>
#include <array.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=c:\users\datwater\documents\autoit\projects\otp tool\otp tool.kxf
$Form1 = GUICreate("Form1", 392, 448, 191, 148)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$Label1 = GUICtrlCreateLabel("seed", 23, 57, 35, 17)
$txtSeed = GUICtrlCreateInput("", 66, 55, 213, 21)
$btnRandomSeed = GUICtrlCreateButton("Create Seed", 287, 53, 74, 25)
GUICtrlSetOnEvent(-1, "btnRandomSeedClick")
$txtCounter = GUICtrlCreateInput("5", 72, 96, 71, 21)
$txtLength = GUICtrlCreateInput("6", 223, 96, 48, 21)
$Label2 = GUICtrlCreateLabel("Counter", 24, 99, 41, 17)
$label3 = GUICtrlCreateLabel("Length", 173, 98, 37, 17)
$txtOutput = GUICtrlCreateEdit("", 38, 213, 326, 201)
$btnGen = GUICtrlCreateButton("Run Command", 149, 154, 80, 25)
GUICtrlSetOnEvent(-1, "btnGenClick")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


local $key      = ""
local $length   = 8
local $count    = 5

Local $cmd = Run("cmd.exe", @ScriptDir, @SW_SHOWNORMAL, $STDIN_CHILD + $STDOUT_CHILD)

While 1
    Sleep(100)
WEnd

Func btnGenOTPClick()
    $length = GUICtrlRead($txtLength)
    $count = GUICtrlRead($txtCounter)
    $Seed  = GUICtrlRead($txtSeed)
    $otp = runCommand($Seed,$length,$count)
    GUICtrlSetData($txtOutput,$otp & @CRLF, "|")

EndFunc

Func btnRandomSeedClick()
    GUICtrlSetData($txtKey,genKey(40))
EndFunc


func runCommand($s,$l,$c)
    ;build the command
    $command = "oathgen.exe -c " & $c & " -l " & $l &" -s " & $s & "& @CRLF
    ConsoleWrite("COMMAND: " & $command & @CRLF) ; debug check
    ;send command to the console
    StdinWrite($cmd, $command)
    $line = ""
    ;loops and gathers all the command output
    While True
        $line &=  StdoutRead($cmd)
        ConsoleWrite($line)  ;debug
        If @error Then ExitLoop
        ;to exit the while loop we look for the blank command prompt, the trimming is needed to get a clean match.
        If StringRight($line,StringLen(@ScriptDir) + 1) = @ScriptDir & ">" Then ExitLoop
        Sleep(30)
    WEnd
        
        ;i do some parsing here of the output then return it , that all works fine
    

EndFunc



Basically where i'm calling StdinWrite($cmd, $command) i can see that $command is what i want it to be,  but the first time it runs nothing is sent and the second time you press the button the command is correct but it actually sends the *old* command to standard in . This is only when running in a GUI though. if you lop out the runCommand function and run it just in a script it works as expected

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...