Das Problem ist, dass die Dateiumleitung eine "Spezialität" von %comspec% (also meist cmd.exe) ist. Deshalb musst Du auch diese starten. Was bei ShellExecute geschieht ist ja Folgendes (ich hoffe, ich gebe das jetzt korrekt wieder):
Zunächst wird die Dateiendung der übergebenen Datei daraufhin untersucht, ob sie registriert ist (Eintrag unter z.B. HKCL\.bla zeigt auf blafile). Nun wird zum geraden ermittelten Schlüssel gesprungen und dieser untersucht (bei einem 'open'-Befehl HKCL\blafile\Shell\open\command) und das dort angegebene Programm ("C:\Programme\
Wuppdi\bla.exe" "%1") mit dem übergebenen Dateinamen als Parameter gestartet. Daher kann es auch sein, dass je nach Befehl (open, print etc.) unterschiedliche Programme aufgerufen werden, da in den entsprechenden Schlüsseln eben unterschiedliche Programme eingetragen sind.