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