Was mir nur spontan, ohne in die
API-Dokumentation zu schauen auffällt ist, dass du bei shellExeInfo zwar die cbSize setzt, aber in den anderen Feldern (die du nicht explizit beschreibst) noch alles mögliche drinsteht.
Ich würde als erstes noch ein
shellExeInfo := Default(TStartupInfo);
einfügen.