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.
Ejecutar un programa y esperar hasta recibir su respuesta.
Started by
poliburro
, Feb 06 2010 11:11 AM
6 replies to this topic
#1
Posted 06 February 2010 - 11:11 AM
#2
Posted 06 February 2010 - 12:39 PM
Todos loa programas devuelven un entero al terminar. En C/C++ es sencillo:
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.
cpp
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; }
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.
#3
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...
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...
#4
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:
Salud OS
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
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin ExitCode := 8; end;
Salud OS
#5
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¡¡¡¡¡¡¡¡
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¡¡¡¡¡¡¡¡
#6
Posted 06 February 2010 - 04:04 PM
Pues por aquí un poco de código:
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.
delphi
function EjecutarCmd(Cmd: String; var Code: Cardinal): Boolean; var ProcInfo: PROCESS_INFORMATION; StartupInfo: TSTARTUPINFO; begin Result:= TRUE; FillChar(StartupInfo,Sizeof(StartupInfo),#0); StartupInfo.cb:= Sizeof(StartupInfo); if CreateProcess(nil,PChar(Cmd),nil,nil,FALSE,0,nil,nil,StartupInfo,ProcInfo) then repeat Sleep(10); // Para no estresar a la CPU GetExitCodeProcess(ProcInfo.hProcess, Code); until (Code <> STILL_ACTIVE); end; // Por ejemplo var Code: Cardinal; begin if EjecutarCmd('programa.exe', Code) then ShowMessage(IntToStr(Code)); 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.
#7
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...
Saludos.
delphi
function ExecAndWait(CommandLine: String; var Code: Cardinal; Visibility: integer): boolean; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin ZeroMemory(@StartupInfo, sizeof(TStartupInfo)); StartupInfo.cb:= sizeof(StartupInfo); StartupInfo.dwFlags:= STARTF_USESHOWWINDOW; StartupInfo.wShowWindow:= Visibility; Result:= CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, StartupInfo, ProcessInfo); WaitForSingleObject(ProcessInfo.hProcess,INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Code); end; // Ejemplo var ExitCode: cardinal; begin ExecAndWait('cmd.exe nn', ExitCode, SW_SHOWDEFAULT); end;
Saludos.