阅读量:1
在使用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函数创建子进程。然后通过管道读取子进程的输出,并输出到控制台。最后清理资源。