Also ich verstehe nicht wozu du überhaupt das aktuelle Verzeichnis wechselst. Du kannst in ShellExecute doch einen kompletten Pfad in dem Dateinamen angeben und statt als Arbeitsverzeichnis für den neuen Prozess nil anzugeben, kannst du auch das richtige Verzeichnis angeben.
Zudem kannst du als Parameter auch direkt PChar(DeinString) angeben statt den komplizierten Weg über StrPCopy zu gehen.
So ist das jeweils nur die eine Zeile.
// EDIT:
Außerdem sollte der zweite Parameter 'open' sein, schließlich ist die auszuführende Operation nicht nil, also nix.
// EDIT2:
Vielleicht solltest du dir die Dokumentation noch einmal anschauen:
http://msdn.microsoft.com/en-us/library/bb762153.aspx