Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Detener un programa (https://www.clubdelphi.com/foros/showthread.php?t=78026)

Angel.Matilla 14-03-2012 11:34:01

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.

ecfisa 14-03-2012 16:59:02

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.

_cero_ 14-03-2012 17:02:50

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" );


ecfisa 14-03-2012 19:09:33

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)

Angel.Matilla 15-03-2012 12:01:31

Gracias a todos por las ideas. Voy a probarlo ahora mismo.

Angel.Matilla 15-03-2012 16:53:16

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.


La franja horaria es GMT +2. Ahora son las 20:29:40.

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