Jump to content


Photo

Ejecutar un programa y esperar hasta recibir su respuesta.


  • Please log in to reply
6 replies to this topic

#1 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 06 February 2010 - 11:11 AM

Que tal compañeros,

Debo desarrollar un programa que al ser ejecutado por otro programa reciba datos como parámetros y al finalizar su tarea le devuelva los datos de resultado al programa que lo invocó.

Mi duda compañeros es de que manera puedo desarrollar el programa para que devuelta datos a la aplicación llamante.

Agradezco de antemano sugerencias y ayuda.

  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 06 February 2010 - 12:39 PM

Todos loa programas devuelven un entero al terminar. En C/C++ es sencillo:


cpp
  1. WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  2. {
  3.   try
  4.   {
  5.       Application->Initialize();
  6.       Application->CreateForm(__classid(TForm1), &Form1);
  7.       Application->Run();
  8.   }
  9.   catch (Exception &exception)
  10.   {
  11.       Application->ShowException(&exception);
  12.   }
  13.   return 0;
  14. }



Retorna cero.

La API ExitProcess termina un proceso con un resultado.

El problema está también en el tipo de resultado que pretendas devolver. Si no es un entero, tendrás que habilitar un sistema de comunicación entre las aplicaciones. Mira este tema sobre los archivos de memoria compartida. También puede ser útil el mensaje Windows WM_COPYDATA, lee este artículo: Cómo pasar datos de cadena entre aplicaciones mediante SendMessage. También te puede servir este artículo orientado a delphi.

Saludos.
  • 0

#3 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 posts
  • LocationMéxico

Posted 06 February 2010 - 12:45 PM

Creo que la forma mas SIMPLE y RAPIDA es que en ambos programas utilces el componente idHECHO y que uno este en espera de la instruccion del OTRO...

Existe otro metodo en el cual utlizas archivos en memoria, pero para el caso creo que es mas simple el IDHECHO.. de las INDY...  deja ver si te pongo un mini ejemplo de como lo harias...

  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 06 February 2010 - 12:47 PM

Hola

Si lo que intentas es regresar algo simple como un ID de retorno y que tu otro programa tenga el siginificado de ese ID es tan simple como esto:



delphi
  1. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  2. begin
  3.   ExitCode := 8;
  4. end;



Salud OS

  • 0

#5 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 06 February 2010 - 12:53 PM

Escafandra, Pcicom, Egostar.

Muchas gracias por las ideas que me han presentado. El programa debe devolver un valor numérico que va del rango de 10,000 a 999,999,999. Ya que es el Id resultado del proceso que ejecuta.

En cuanto tome la solución les comunicaré.

Muchas gracias de nuevo¡¡¡¡¡¡¡¡
  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 06 February 2010 - 04:04 PM

Pues por aquí un poco de código:


delphi
  1. function EjecutarCmd(Cmd: String; var Code: Cardinal): Boolean;
  2. var
  3.   ProcInfo: PROCESS_INFORMATION;
  4.   StartupInfo: TSTARTUPINFO;
  5. begin
  6.   Result:= TRUE;
  7.   FillChar(StartupInfo,Sizeof(StartupInfo),#0);
  8.   StartupInfo.cb:= Sizeof(StartupInfo);
  9.   if CreateProcess(nil,PChar(Cmd),nil,nil,FALSE,0,nil,nil,StartupInfo,ProcInfo) then
  10.     repeat
  11.       Sleep(10); // Para no estresar a la CPU
  12.       GetExitCodeProcess(ProcInfo.hProcess, Code);
  13.     until (Code <> STILL_ACTIVE);
  14. end;
  15.  
  16. // Por ejemplo
  17. var
  18.   Code: Cardinal;
  19. begin
  20.   if EjecutarCmd('programa.exe', Code) then
  21.     ShowMessage(IntToStr(Code));
  22. end;



El valor de retorno, ya lo dijo egostar, se devuelve con ExitCode. El unico problema se produce cuando el programa devuelve el valor 259 que se corresponde con la constante STILL_ACTIVE, ya que nunca se saldría del bucle. Tendrías que buscar una solución para esto, como por ejemplo que la aplicación siempre devuelva el resultado multiplicado por 2, de forma que sería imposible devolver 259.
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 06 February 2010 - 05:11 PM

Quizás esta otra implementación sin bucle y con posibilidad de configurar la visualización del programa llamado...



delphi
  1. function ExecAndWait(CommandLine: String; var Code: Cardinal; Visibility: integer): boolean;
  2. var
  3.   StartupInfo: TStartupInfo;
  4.   ProcessInfo: TProcessInformation;
  5. begin
  6.   ZeroMemory(@StartupInfo, sizeof(TStartupInfo));
  7.  
  8.   StartupInfo.cb:= sizeof(StartupInfo);
  9.   StartupInfo.dwFlags:= STARTF_USESHOWWINDOW;
  10.   StartupInfo.wShowWindow:= Visibility;
  11.  
  12.   Result:= CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, StartupInfo, ProcessInfo);
  13.   WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
  14.   GetExitCodeProcess(ProcessInfo.hProcess, Code);
  15. end;
  16.  
  17. // Ejemplo
  18. var
  19.   ExitCode: cardinal;
  20. begin
  21.   ExecAndWait('cmd.exe nn', ExitCode, SW_SHOWDEFAULT);
  22. end;




Saludos.
  • 0




IP.Board spam blocked by CleanTalk.