il problema di Shell è che non attende la fine del programma che lanci per restituire il controllo all'applicazione (asincrono).

prova a cercare nell MSDN CreateProcessA,WaitForSingleObject e CloseHandle, con queste funzioni (che devi importare dal Kernel32) puoi fare in modo di attendere fino a quando l'applicazione che lanci non termina....