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