SoloCodigo

Programación General => C/C++ => C++ Builder => Mensaje iniciado por: Yañez en Miércoles 30 de Mayo de 2007, 19:43

Título: Llamar A Aplicación Y Esperar Que Termine Para Seg
Publicado por: Yañez en Miércoles 30 de Mayo de 2007, 19:43
Hola!!  :hola:

Tengo una aplicación que llama a archivos de ayuda (.chm) y a aplicaciones java (.jar) con ShellExecute. Pero en el caso de las aplicaciones java, me gustaría que al llamarlas mi aplicación quedara bloqueada, que sólo pueda seguir ocupándola cuando el programa java deje de ejecutarse.

Buscando en antiguos post vi un mensaje de Eternal Idol en que decía que se puede hacer con ShellExecuteEx (que devuelve un handle) y luego WaitForSingleObject. Lo pongo textual mejor:

Citar
Tanto ShellExecuteEx (no ShellExecute) como CreateProcess te devuelven un handle a un proceso y podes hacer un WaitForSingleObject infinito al mismo, este te devolvera el control cuando termine el proceso.

El problema es que no he encontrado ayuda para estas funciones. La ShellExecute si me aparece en la ayuda de Builder pero no así la ShellExecuteEx ni la WaitForSingleObject.

De antemano, muchas gracias....
Título: Re: Llamar A Aplicación Y Esperar Que Termine Para Seg
Publicado por: Yañez en Miércoles 30 de Mayo de 2007, 19:49
Vaya!!! No me había dado cuenta que en la ayuda de ShellExecute hay un enlace para ShellExecuteEx  :P

Veré que me dice y lo probaré...

De todas maneras si alguien tiene una idea sigue siendo úitl.... :hola:
Título: Re: Llamar A Aplicación Y Esperar Que Termine Para Seg
Publicado por: Eternal Idol en Miércoles 30 de Mayo de 2007, 20:19
Aca tenes un ejemplito de como usar ShellExecuteEx:

Código: Text
  1.  
  2. SHELLEXECUTEINFO sInfo;
  3. ZeroMemory(&sInfo, sizeof(SHELLEXECUTEINFO));
  4. sInfo.cbSize = sizeof(SHELLEXECUTEINFO);
  5. sInfo.lpVerb = "open";
  6. sInfo.lpFile = "notepad.exe";
  7. sInfo.nShow = SW_SHOWDEFAULT;
  8. ShellExecuteEx(&sInfo);
  9.  
  10.  

Recorda que en SHELLEXECUTEINFO hay un campo llamado hProcess, podes esperar con INFINITE sobre el si especificas el valor SEE_MASK_NOCLOSEPROCESS en fMask.

Lee bien la ayuda y proba, tal vez ShellExecuteEx no te sirva para todos los casos, CreateProcess es mejor.
Título: Re: Llamar A Aplicación Y Esperar Que Termine Para Seg
Publicado por: Yañez en Viernes 1 de Junio de 2007, 11:27
Gracias Eternal Idol!!!!    :hola:

Lo he probado tal como dijiste y funciona perfecto. Después con calma probaré el CreateProcess también.

Aquí va el código  :comp:  (con la espera incluida):

Código: Text
  1.  
  2. SHELLEXECUTEINFO sInfo;
  3. ZeroMemory(&sInfo, sizeof(SHELLEXECUTEINFO));
  4. sInfo.cbSize = sizeof(SHELLEXECUTEINFO);
  5. sInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
  6. sInfo.lpVerb = "open";
  7. sInfo.lpFile = "notepad.exe";
  8. sInfo.nShow = SW_SHOWDEFAULT;
  9. ShellExecuteEx(&sInfo);
  10. WaitForSingleObject(sInfo.hProcess, INFINITE);
  11. Application->MessageBox("Este mensaje aparecerá al finalizar la plicación", "Información", MB_OK);
  12.  
  13.  
Título: Re: Llamar A Aplicación Y Esperar Que Termine Para Seg
Publicado por: Eternal Idol en Viernes 1 de Junio de 2007, 11:29
Cita de: "Yañez"
Gracias Eternal Idol!!!!
De nadas  B)