je ne comprend pas vraiment ce que tu veux faire.
Tu écrit un ou deux programme dans cette histoire. Lequel appel lequel. Qu´est ce que chaque programme est cencé faire. Le compresseur c´est "envoi FTP.exe", ou alors c´est lui qui appel l´autre ?
normallement shellexecute crée un nouveau programme, donc même si le programme appelant se ferme le programme qui a été crée doit continuer à tourner.
Seulement shellexecute ne te retourne aucune information sur le programme lancé (totu simplement, parce que ça ne lance pas forcément de programme). Or, pour waitforsingleobject, il te faut un handle sur le processus que tu veux attendre. Il vaut donc mieux utiliser CreateProcess pour lancer ton autre programme. Cette fonction est prévu pour ça, et te retournera donc les informations dont tu as besoin.
Générallement ShellExecute est à réserver pour "exécuter" des fichiers quelconques, c´est-à-dire les ouvrirs avec le logiciel associé avec leurs extensions.