CreateProcess创建的cmd.exe无法读取WriteFile写入内容如何解决
问题描述
通过CreateProcess创建cmd.exe子进程,启动阶段传入的第一条命令可正常执行,进程创建完成后通过WriteFile写入的后续命令无响应、无法运行。
错误原因
- 后续命令错误携带cmd启动参数:
/k是cmd.exe的进程启动参数,仅在创建进程时传入有效。子进程进入交互运行状态后,直接输入命令内容即可,不需要携带启动参数。 - 命令末尾未加换行符:cmd交互模式下,只有接收到换行符
\r\n才会判定输入结束,触发命令执行。你写入的命令没有换行,cmd会一直处于等待输入状态,不会执行命令。 - WriteFile参数不规范:
WriteFile的第四个参数需要传入DWORD*类型的指针接收实际写入字节数,直接传NULL可能导致调用异常。
修复步骤
- 修改命令拼接逻辑,去掉
/k参数,末尾添加换行符:
// 原代码 sprintf(kom,"/k echo %d",i); // 修改后 sprintf(kom,"echo %d\r\n",i);
- 修正WriteFile调用参数:
DWORD wLen; // 原代码 BOOL odgw = WriteFile(_stdin_wr,kom,strlen(kom),0,0); // 修改后 BOOL odgw = WriteFile(_stdin_wr, kom, strlen(kom), &wLen, 0); // 可选:刷新缓冲区确保命令立即写入管道 FlushFileBuffers(_stdin_wr);
修复后效果
修改完成后运行程序,即可看到echo 2到echo 9的命令依次正常执行,输出对应内容。
内容的提问来源于stack exchange,提问作者cnikbesku
相关产品推荐
相关产品推荐

