Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-03-2012
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.");
}
y necesito que el programa se detenga hasta que se cierre Acrobat Reader.
Responder Con Cita
  #2  
Antiguo 14-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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 ...
}
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 14-03-2012
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Thumbs up

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" );
Responder Con Cita
  #4  
Antiguo 14-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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);
}
Llamada de ejemplo:
Código:
{
  CreateProcessAndWait("C:\\Program Files\\Adobe\\Reader 9.0\\Reader\\AcroRd32.exe",
    "C:\\PREVIEW.PDF");
  ...
}
Saludos.

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.
Responder Con Cita
  #5  
Antiguo 15-03-2012
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias a todos por las ideas. Voy a probarlo ahora mismo.
Responder Con Cita
  #6  
Antiguo 15-03-2012
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 15:54:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi