Mit ShellExecute bzw. CreateProcess wird ja auch nur ein separater Prozess gestartet und der Aufruf kehrt sofort sofort zurück.
Wenn du in deinem Programm auf das Ende dieses Prozesses warten willst, dann musst du das auch tun. Das geht mit einer entsprechenden WaitFor-Anweisung, wobei du an das Process-
Handle z.B. bei CreateProcess über den letzten Parameter lpProcessInformation herankommst.
Allerdings ist deine Anwendung dann während des WaitFor blockiert. Man sollte dann entsprechende Vorkehrungen treffen, um das gegebenfalls abzubrechen.
Bei Delphi About gibt es ein Beispiel:
http://delphi.about.com/od/windowssh...uteprogram.htm