FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Detener un programa
¿Cómo puedo detener la ejecución de un programa hasta que se cierre una aplicación externa que he abierto con un ShellExecute? Tengo este código:
Código:
try { ShellExecute(Handle, "open", ("Preview.pdf").c_str(), NULL, NULL, SW_MAXIMIZE); } catch(...) { ShowMessage("No se puede visualizar el informe."); } |
#2
|
||||
|
||||
Hola.
En lugar de ShellExecute tendrías que usar CreateProcess y WaitForSingleObject. Un ejemplo para llamar a la calculadora de windows y esperar a que esta cierre para continuar: Código:
{ STARTUPINFO StartInfo; PROCESS_INFORMATION ProcInfo; memset(&ProcInfo, 0, sizeof(ProcInfo)); memset(&StartInfo, 0 , sizeof(StartInfo)); StartInfo.cb = sizeof(StartInfo); if ( CreateProcess("C:\\WINDOWS\\SYSTEM32\\CALC.EXE",NULL, NULL, NULL, NULL, NULL, NULL, NULL, &StartInfo, &ProcInfo) ) { WaitForSingleObject(ProcInfo.hThread, INFINITE); SetFocus(); } // Continuar ... }
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
|||
|
|||
Pfff eso se vuelve un poco complicado, porque con ShellExecute no se puede, pero si con CreateProcess, el problema de este ultimo es que no te ejecuta archivos directamente por lo que tendrás que buscar la ruta del programa que abre el archivo mediante registro de Windows u otro método, por lo demás te dejo código que hace lo que quieres, en este ejemplo ejecuto el programa de acrobat pasándole el archivo que quiero que habrá como parámetro y desplegando un mensaje después de que se cierra el acrobat.
Código:
STARTUPINFO si; //Estructura de inicio de proceso PROCESS_INFORMATION pi; //Estructura que trae información del proceso //Limpiamos estructuras e inciamos SecureZeroMemory( &si, sizeof( si ) ); SecureZeroMemory( &pi, sizeof( pi ) ); si.cb = sizeof( si ); if( CreateProcessW( //Crea el proceso igual que ShellExecute NULL, L"C:\\Program Files (x86)\\Adobe\\Acrobat 10.0\\Acrobat\\Acrobat.exe C:\\Preview.pdf", NULL, NULL, false, 0, NULL, NULL, &si, &pi ) ) { WaitForSingleObject( pi.hProcess, INFINITE ); //Espera a que el proceso se cierre } ShowMessage( "Este mensaje va después" ); |
#4
|
||||
|
||||
Hola.
Para que el código sea reutilizable podés hacerte una función: Código:
void CreateProcessAndWait(AnsiString AppName, AnsiString Args) { STARTUPINFO StartInfo; PROCESS_INFORMATION ProcInfo; Trim(AppName); Trim(Args); Args = " " + Args; memset(&ProcInfo, 0, sizeof(ProcInfo)); memset(&StartInfo, 0 , sizeof(StartInfo)); StartInfo.cb = sizeof(StartInfo); if (CreateProcess(AppName.c_str(), Args.c_str(), NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &StartInfo, &ProcInfo)) WaitForSingleObject(ProcInfo.hThread, INFINITE); } Código:
{ CreateProcessAndWait("C:\\Program Files\\Adobe\\Reader 9.0\\Reader\\AcroRd32.exe", "C:\\PREVIEW.PDF"); ... } Edito: Tené en cuenta que si la aplicación es de 16 bits lpApplicationName tendrá que ser NULL, mientras que el nombre de la aplicacion y los parámetros deberan ser especificados en lpCommandLine. (CREATE PROCESS function)
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 14-03-2012 a las 19:22:37. |
#5
|
||||
|
||||
Gracias a todos por las ideas. Voy a probarlo ahora mismo.
|
#6
|
||||
|
||||
Reitero el agradecimiento a los que me habéis dado una respuesta. En este caso concreo, y como se trata de visualizar Pdf, encontré un solución mejor con lo sugeriod en Visor archivos PDF.
No obstante me guardo el código que habéis subido porque es muy interesante y seguro que me hace falta en otro momento. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Detener dispositivo USB | Saindoft | API de Windows | 2 | 28-11-2008 08:26:37 |
Detener el autonumerico | jzginez | Firebird e Interbase | 3 | 20-08-2006 03:27:51 |
Detener ejecucion de programa | Luli | Varios | 8 | 04-05-2006 05:52:12 |
Detener aplicacion | trex2000 | Varios | 4 | 22-04-2005 23:08:37 |
Detener un bucle | lfidanza | Varios | 5 | 25-06-2003 00:36:14 |
|