如何使用C++向CreateProcess创建的子进程发送输入命令
实现方案
核心思路是通过匿名管道重定向子进程的标准输入流,让父进程可以通过管道写入端向子进程发送输入数据,具体实现逻辑如下:
1. 原有代码调整说明
你提供的CreateProcess调用有两处需要修改:
- 原
bInheritHandles参数设为了FALSE,需要改为TRUE,允许子进程继承父进程创建的管道句柄 - 需要给
STARTUPINFO结构新增标准输入句柄配置,将子进程的标准输入绑定到管道的可读端
2. 完整实现代码示例
#include <windows.h> #include <iostream> using namespace std; int main() { SECURITY_ATTRIBUTES sa = {0}; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; // 开启句柄继承权限 sa.lpSecurityDescriptor = NULL; HANDLE hPipeRead, hPipeWrite; // 创建匿名管道 if (!CreatePipe(&hPipeRead, &hPipeWrite, &sa, 0)) { cout << "创建管道失败,错误码:" << GetLastError() << endl; return 1; } STARTUPINFO si = {0}; si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES; // 通知子进程使用自定义的标准句柄 si.hStdInput = hPipeRead; // 子进程标准输入绑定到管道读端 si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); // 保留原有控制台输出 si.hStdError = GetStdHandle(STD_ERROR_HANDLE); // 保留原有错误输出 PROCESS_INFORMATION pi = {0}; WCHAR myexe[] = L"myexe.exe"; // CreateProcess命令行参数需要使用可写内存,不可直接传const常量 // 启动子进程 if (!CreateProcess( NULL, myexe, NULL, NULL, TRUE, // 开启句柄继承 0, NULL, NULL, &si, &pi )) { cout << "创建子进程失败,错误码:" << GetLastError() << endl; CloseHandle(hPipeRead); CloseHandle(hPipeWrite); return 1; } // 父进程不需要管道读端,提前关闭避免资源泄漏 CloseHandle(hPipeRead); // 向子进程发送输入数据,末尾加换行符匹配cin的读取规则(cin遇到空白符即结束单次读取) const char* sendMsg1 = "first_input\n"; DWORD writeLen; WriteFile(hPipeWrite, sendMsg1, strlen(sendMsg1), &writeLen, NULL); const char* sendMsg2 = "second_input\n"; WriteFile(hPipeWrite, sendMsg2, strlen(sendMsg2), &writeLen, NULL); // 无需继续发送数据时可关闭管道写端 // CloseHandle(hPipeWrite); // 等待子进程退出后清理所有资源 WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); CloseHandle(hPipeWrite); return 0; }
注意事项
- 如果使用ANSI编码版本的CreateProcess,同样要注意命令行参数需要传入可写的内存区域,不可直接传递字符串常量
- 如果需要接收子进程的输出返回,可以用同样的管道逻辑重定向子进程的标准输出、标准错误流
内容的提问来源于stack exchange,提问作者akdrkr
相关产品推荐
相关产品推荐

