Jue Ene 18, 2007 1:47 pm
|
 |
jclp77
Perlero Nuevo

|
Registrado: 06 Sep 2006
Mensajes: 21
Ubicación: México
|
|
| Abrir aplicación Win32 |
|
|
Hola a todos!!
Requiero de conocimiento , resulta que tengo un script que cuando quiero abrir una aplicación que me solicita un usuario y un pwd y no me permite seguir con el script hasta que cierro la apliación, ya utilice system (aplicación) y exec (aplicacion) pero en los dos casos no me regresa al script una vez ejecutado el comando. Alguna idea??
Saludos |
|
|
|
Jue Ene 18, 2007 1:52 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
|
|
|
Se puede hacer con open, qx o ``;
Ahh! sí y con IPC::Open2, IPC::Open3  |
|
Jue Ene 18, 2007 2:31 pm
|
 |
jclp77
Perlero Nuevo

|
Registrado: 06 Sep 2006
Mensajes: 21
Ubicación: México
|
|
|
|
|
Hola!!
Ya utilice también open, qx y ``, pero como es una aplicación visual basic se queda esperando el usuario y password y no regresa al script.
Saludos |
|
Jue Ene 18, 2007 3:37 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
|
|
|
No te entiendo.
¿Qué quieres hacer, leer la salida?
¿Puedes mostrar un poco de código o explicar mejor? |
|

Jue Ene 18, 2007 4:29 pm
|
 |
jclp77
Perlero Nuevo

|
Registrado: 06 Sep 2006
Mensajes: 21
Ubicación: México
|
|
|
|
|
No quiero leer la salida, simplemente abrir el programa ya que le pasaré los parámetros utilizando el módulo win32::guitest (sendkeys, pushbuttons, etc), pero una vez que abro el programa no ejecuta las demás instrucciones hasta que cierro el programa.
| Perl: | use Win32:: GuiTest qw(FindWindowLike GetWindowText
SetForegroundWindow SendKeys );
system "C:\\Consulta.exe"; #AQUÍ ES DONDE SE QUEDA
$Win32:: GuiTest:: debug = 0;
my @windows = FindWindowLike (0, "^Consulta");
for (@windows) {
SetForegroundWindow ($_);
SendKeys ("123{TAB}123{TAB}{ENTER}"); #ENVIA USUARIO Y PASSWORD.
sleep(5);
SendKeys ("%c");
SendKeys ("p");
sleep(1);
SendKeys ("34897000156470{TAB}{ENTER}");
sleep(3);
SendKeys ("%p");
SendKeys ("%o");
SendKeys ("p");
SendKeys ("s");
sleep(3);
SendKeys ("{ENTER}");
sleep(2);
SendKeys ("{ENTER}");
sleep(2);
SendKeys ("{ENTER}");
SendKeys ("%n");
SendKeys ("{ENTER}");
sleep(2);
SendKeys ("34897000156470{TAB}{ENTER}");
} |
|
|

Jue Ene 18, 2007 4:53 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
|
|
|
Ya entendí, pudes usar fork o (no se si en Windows sirva) haces el system con &:
system("C:\\programa.exe &"); |
|

Jue Ene 18, 2007 5:30 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4225
Ubicación: Valladolid, España
|
|
|
|
|
Sí, ese es el problema. Al ejecutar system(), estás pidiendo que ejecute un programa y que ESPERE a que termine.
Lo que necesitas es mandar a Windows que arranque un nuevo proceso, pero que te permita seguir con el tuyo.
El módulo que debes usar es Win32::Process.
El único problema es encontrar el/los flags que debes usar para crear ese proceso. En esta página hay algunas, pero no todas. Leyendo el libro Learning Perl on Win32 Systems, indica que es DETACHED_PROCESS. Ejemplo.
Y sobre el fork(), se comentaba desde ActiveState que iban a hacerlo funcionar igual que en UNIX, pero me parece que no, que todavía funciona como hace unos años: el proceso que hace el fork se queda esperando hasta que el proceso hijo termina. |
|

Vie Ene 19, 2007 5:45 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
|
|
|
¿Y Windows no soporta threads?
Hay que recordar que su kernel, desde 9x soporta POSIX |
|

Vie Ene 19, 2007 6:00 pm
|
 |
jclp77
Perlero Nuevo

|
Registrado: 06 Sep 2006
Mensajes: 21
Ubicación: México
|
|
|
|
|
Hola a todos, ya pude manejarlo independiente en el mismo script utilizando win32::process, ahí va una parte del código:
| Perl: | use Win32:: GuiTest qw(FindWindowLike GetWindowText SetForegroundWindow SendKeys );
use Win32:: Process;
use Win32;
my $program = q{C:/Consulta.exe };
my $process;
unless ( Win32:: Process:: Create($process, $program, "calc", 0, NORMAL_PRIORITY_CLASS, '.') ) {
croak ErrorReport ();
}
sleep(1);
my ($consulta) = FindWindowLike 0, '^Calc';
SetForegroundWindow $consulta;
SendKeys ("123{TAB}123{TAB}{ENTER}"); #usuario y pwd
sleep(3);
SendKeys ("%c");
SendKeys ("p");
sleep(1);
SendKeys ("34897000156470{TAB}{ENTER}");
sleep(3);
SendKeys ("%p");
SendKeys ("%o");
SendKeys ("p");
SendKeys ("s");
sleep(3);
SendKeys ("{ENTER}");
sleep(2);
SendKeys ("{ENTER}");
sleep(2);
SendKeys ("{ENTER}");
SendKeys ("%n");
SendKeys ("{ENTER}");
sleep(2);
SendKeys ("34897000156470{TAB}{ENTER}"); |
|
|

Powered by phpBB © 2001, 2005 phpBB Group
|