Проблема с наследованием дескрипторов потоков. Ты передаёшь дескрипторы, локальные для отца-предка, в потомке они не видны. Для того, чтобы потомок смог ими воспользоваться, необходимо разрешить наследование дескрипторов.
Комментарий к флагу STARTF_USESTDHANDLES (поле dwFlags структуры STARTUPINFO):
If this flag is specified when calling one of the process creation functions, the handles must be inheritable and the function's
bInheritHandles parameter must be set to TRUE.
Поставь в CreateProcess параметр bInheritHandles в TRUE, и при создании файла в CreateFile разреши наследование: lpSecurityAttributes не должен быть нулевым. Скажем,
SECURITY_ATTRIBUTES securityAttrib;
securityAttrib.nLength = sizeof(SECURITY_ATTRIBUTES);
securityAttrib.bInheritHandle = TRUE;
securityAttrib.lpSecurityDescriptor = NULL;
parms.hStdOutput=CreateFile(_outfile,GENERIC_WRITE,FILE_SHARE_READ,
&securityAttrib,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
Ещё надо проинициализировать parms.hStdInput = INVALID_HANDLE_VALUE