• Miércoles 26 de Junio de 2024, 07:20

Autor Tema:  Llamar A Aplicación Y Esperar Que Termine Para Seg  (Leído 1931 veces)

Yañez

  • Miembro activo
  • **
  • Mensajes: 48
    • Ver Perfil
Llamar A Aplicación Y Esperar Que Termine Para Seg
« en: Miércoles 30 de Mayo de 2007, 19:43 »
0
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....

Yañez

  • Miembro activo
  • **
  • Mensajes: 48
    • Ver Perfil
Re: Llamar A Aplicación Y Esperar Que Termine Para Seg
« Respuesta #1 en: Miércoles 30 de Mayo de 2007, 19:49 »
0
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:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Llamar A Aplicación Y Esperar Que Termine Para Seg
« Respuesta #2 en: Miércoles 30 de Mayo de 2007, 20:19 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Yañez

  • Miembro activo
  • **
  • Mensajes: 48
    • Ver Perfil
Re: Llamar A Aplicación Y Esperar Que Termine Para Seg
« Respuesta #3 en: Viernes 1 de Junio de 2007, 11:27 »
0
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.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Llamar A Aplicación Y Esperar Que Termine Para Seg
« Respuesta #4 en: Viernes 1 de Junio de 2007, 11:29 »
0
Cita de: "Yañez"
Gracias Eternal Idol!!!!
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.