Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Abrir aplicación Win32

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Jue Ene 18, 2007 1:47 pm
jclp77
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Sep 2006
Mensajes: 21
Ubicación: México
Abrir aplicación Win32 Responder citando

Hola a todos!!

Requiero de conocimiento Very Happy, 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
Mensaje Jue Ene 18, 2007 1:52 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Se puede hacer con open, qx o ``;

Ahh! sí y con IPC::Open2, IPC::Open3 Smile
Mensaje Jue Ene 18, 2007 2:31 pm
jclp77
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Sep 2006
Mensajes: 21
Ubicación: México
Responder citando

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
Mensaje Jue Ene 18, 2007 3:37 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

No te entiendo.
¿Qué quieres hacer, leer la salida?
¿Puedes mostrar un poco de código o explicar mejor?
Mensaje Jue Ene 18, 2007 4:29 pm
jclp77
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Sep 2006
Mensajes: 21
Ubicación: México
Responder citando

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}");
  }
Mensaje Jue Ene 18, 2007 4:53 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Ya entendí, pudes usar fork o (no se si en Windows sirva) haces el system con &:
system("C:\\programa.exe &");
Mensaje Jue Ene 18, 2007 5:30 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4225
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Vie Ene 19, 2007 5:45 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

¿Y Windows no soporta threads?
Hay que recordar que su kernel, desde 9x soporta POSIX
Mensaje Vie Ene 19, 2007 6:00 pm
jclp77
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Sep 2006
Mensajes: 21
Ubicación: México
Responder citando

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}");
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group