在使用CreateProcess函数创建进程时,可以通过STARTUPINFO结构体中的hStdInput、hStdOutput和hStdError成员来实现进程的重定向。
创建一个STARTUPINFO结构体,并设置dwFlags成员为STARTF_USESTDHANDLES,这样就会使用hStdInput、hStdOutput和hStdError成员指定的句柄。
创建一个匿名管道,用于实现输入/输出的重定向。管道的读取端和写入端分别作为子进程的标准输入和标准输出。
将管道的读取端和写入端分别设置为STARTUPINFO结构体中的hStdInput和hStdOutput成员。
调用CreateProcess函数创建子进程,同时将STARTUPINFO结构体作为参数传递进去。
下面是一个示例代码:
#include <windows.h>
#include <iostream>
int main() {
SECURITY_ATTRIBUTES saAttr;
HANDLE hStdoutRd, hStdoutWr, hStdinRd, hStdinWr;
STARTUPINFO si;
PROCESS_INFORMATION pi;
// 创建匿名管道
ZeroMemory(&saAttr, sizeof(SECURITY_ATTRIBUTES));
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&hStdoutRd, &hStdoutWr, &saAttr, 0);
CreatePipe(&hStdinRd, &hStdinWr, &saAttr, 0);
// 设置STARTUPINFO结构体
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.hStdOutput = hStdoutWr;
si.hStdInput = hStdinRd;
si.dwFlags |= STARTF_USESTDHANDLES;
// 创建子进程
CreateProcess(NULL, "child.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
// 关闭管道的写入端,避免出现死锁
CloseHandle(hStdoutWr);
CloseHandle(hStdinRd);
// 读取子进程的输出
CHAR buffer[4096];
DWORD bytesRead;
ReadFile(hStdoutRd, buffer, sizeof(buffer), &bytesRead, NULL);
// 输出子进程的输出
std::cout << buffer << std::endl;
// 清理资源
CloseHandle(hStdoutRd);
CloseHandle(hStdinWr);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
在上面的示例中,我们创建了一个匿名管道用于子进程的输入/输出重定向,并通过CreateProcess函数创建子进程。然后通过管道读取子进程的输出,并输出到控制台。最后清理资源。