Página 1 de 1

por que no funciona?

Publicado: 13 Jun 2010, 18:14
por xapu
buenas...
estaba creando un programa que leyera los datos de un cmd que abre con el para poder copiarlos pero no funciona..
el caso es que aqui teneis el codigo:

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
Global $foo = Run("cmd.exe",@SystemDir, @SW_HIDE, $STDOUT_CHILD + $STDIN_CHILD)
$Dat = StdoutRead($foo)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("CMD", 714, 390, -1, -1)
$Edit1 = GUICtrlCreateEdit("", 16, 16, 681, 321)
GUICtrlSetCursor (-1, 5)
GUICtrlSetData($edit1,$dat)
$Input1 = GUICtrlCreateInput("", 104, 354, 593, 21)
$Button1 = GUICtrlCreateButton("ok", 16, 352, 83, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$Dat = StdoutRead($foo)
GUICtrlSetData($edit1,$dat)
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $button1			
			StdinWrite($foo,guictrlread($input1))
			StdinWrite($foo,"{enter}")
	EndSwitch
WEnd

haber por que ******* no va!! :smt013

Re: por que no funciona?

Publicado: 14 Jun 2010, 09:03
por Ximorro
Pues mira, se arregla haciendo dos cambios, aunque he encontrado un problemilla.
Los cambios:
a) El edit lo reactualizas cada vez, con lo que lo borras enseguida, tienes que AÑADIR a lo que ya había, no sustituirlo
b) No envíes un {enter}, creo que eso es sólo para los Send, aquí hay que enviar un @CRLF.

Así el bucle queda de esta manera:

Código: Seleccionar todo

While 1
	$Dat = StdoutRead($foo)
	GUICtrlSetData($Edit1, $Dat, "1") ;Cualquier cosa distinta de vacía en el tercer parámetro añade en vez de sobreescribir
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			StdinWrite($foo, GUICtrlRead($Input1))
			StdinWrite($foo, @CRLF)
	EndSwitch
WEnd
El problemilla es que con salidas muy largas se queda bloqueado, quizás sea problema de capacidad del Editbox, eso ya me pasó en otro programa, me temo que no puedes llenarlo indefinidamente.
Para probarlo sin bloquearlo yo he hecho:
dir *.log [Button1]
help [Button1]
y funciona perfectamente

Si hago un Dir de todo el directorio, como estamos en Windows\system32 (cosa que he comprobado haciendo un cd en tu programa ;-) )... ni llega a acabarlo, el edit se bloquea antes...

Efectivamente, acabo de comprobarlo, un editbox almacena unas 32kb, he redireccionado el dir a un archivo y ocupa... ¡¡¡122kb!!!.
Como con StdoutRead vas leyendo trozo a trozo probablemente podrás ir contando cuánto hay en el editbox y cuando vaya a llenarse... pues no hay más remedio que vaciarlo. O si te lo curras pues hay que ir borrando por el principio...

Por lo demás funciona perfectamente.