Ver Mensaje Individual
  #2  
Antiguo 27-08-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Lo usual para este tipo de tareas es utilizar la función WaitForSingleObject. Sin embargo, esta función espera un identificador del proceso al que se va a esperar y la función ShellExecute no te lo proporciona.

Una alternativa es usar CreateProcess para ejecutar directamente la aplicación que maneja tus archivos udl en lugar de hacerlo a través del shell (como lo hace ShellExecute). En el hilo ejecutar archivo y esperar que termine puedes ver un ejemplo de uso aunque tendrás que adaptarlo un poco llenando los campos pertinentes en la estructura TStartupInfo.

Otra opción es usar ShellExecuteEx. Aquí te pongo un ejemplo de uso:

Código Delphi [-]
var
  ExecInfo: TShellExecuteInfo;

begin
  ExecInfo.cbSize := SizeOf(ExecInfo);
  ExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
  ExecInfo.Wnd := Handle;
  ExecInfo.lpVerb := 'open';
  ExecInfo.lpFile := 'prueba.udl';
  ExecInfo.lpParameters := nil;
  ExecInfo.lpDirectory := nil;
  ExecInfo.nShow := SW_SHOW;

  ShellExecuteEx(@ExecInfo);
  WaitForSingleObject(ExecInfo.hProcess, INFINITE);

  {
    El código en esta parte no se ejecutará
    hasta que termine la otra aplicacíon
  }

Ten en cuenta lo siguiente. Al menos con ShellExecuteInfoEx (no lo he probado con CreateProcess) WaitForSingleObject regresará de inmediato en algunas circunstancias. Por ejemplo, si la aplicación que maneja los documentos ya está abierta y usa el mismo proceso para abrir el nuevo documento. Esto sucede con una aplicación MDI o aplicaciones como Internet Explorer que aun cuando no son MDI sí usan el mismo proceso para abrir nuevos documentos.

// Saludos
Responder Con Cita