Что нового

Не могу прочитать из потока. Не могу записать в поток. Cmd.exe

newbie215

Новичок
Сообщения
18
Репутация
0
Привет! Пишу библиотеку для считывания из потока и записи в поток интерпретатора Windows cmd.exe. Возникла проблема: срабатывает программа только один раз, т.е. ввожу команду, например help, нажимаю Send, выводится результат, потом ввожу еще раз команду, нажимаю Send, результата нет. Не могу разобраться у меня чтение или запись не работает.
Код:
#include<GUIConstantsEx.au3>
#include<Constants.au3>

$Win = GUICreate(@UserName,600,800)
$ResultEdit = GUICtrlCreateEdit("",10,10,580,670);Сюда выводится результат
$CMLineEdit = GUICtrlCreateEdit("",10,680,580,80);Сюда вводятся команды
$SendButton = GUICtrlCreateButton("Send",10,770,80,20);Отправить команду интерпретатору
$sPid = Run("C:\Windows\system32\cmd.exe",@SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
GUISetState(@SW_SHOW)
While 1
	$GUIGetMsg = GUIGetMsg()
	If $GUIGetMsg = $SendButton Then
		$sResult = ""
		$sLine = GUICtrlRead($CMLineEdit)
		StdinWrite($sPid,$sLine)
		StdinWrite($sPid,@CRLF)
		StdinWrite($sPid)
		While 1
			$sResult &= StdoutRead($sPid,False,False)
			If @error Then ExitLoop
		WEnd
		GUICtrlSetData($ResultEdit,$sResult)
		GUICtrlSetData($CMLineEdit,"")
	EndIf
	If $GUIGetMsg = $GUI_EVENT_CLOSE Then Exit
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
newbie215
на форуме много примеров. вот навскидку http://autoit-script.ru/index.php/topic,3768.msg27342.html#msg27342
http://autoit-script.ru/index.php/topic,11476.0.html
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
newbie215
Вот готовая реализация http://autoit-script.ru/index.php?topic=13144.msg84107#msg84107

А по вашему коду: перенесите строку запуска cmd в обработчик кнопки
Код:
#include<GUIConstantsEx.au3>
#include<Constants.au3>
#include<WinAPIEx.au3>

$Win = GUICreate(@UserName,600,800)
$ResultEdit = GUICtrlCreateEdit("",10,10,580,670);Сюда выводится результат
$CMLineEdit = GUICtrlCreateEdit("",10,680,580,80);Сюда вводятся команды
$SendButton = GUICtrlCreateButton("Send",10,770,80,20);Отправить команду интерпретатору
GUISetState(@SW_SHOW)
While 1
    $GUIGetMsg = GUIGetMsg()
    If $GUIGetMsg = $SendButton Then
        $sPid = Run(@ComSpec,@SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
        $sLine = GUICtrlRead($CMLineEdit)
        StdinWrite($sPid,$sLine & @CRLF)
        StdinWrite($sPid)
        $sResult = ""
        While 1
            $sResult &= StdoutRead($sPid,False,False)
            If @error Then ExitLoop
        WEnd
        GUICtrlSetData($ResultEdit,_WinAPI_OemToChar($sResult))
        GUICtrlSetData($CMLineEdit,"")
    EndIf
    If $GUIGetMsg = $GUI_EVENT_CLOSE Then Exit
WEnd
 
Верх