在使用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函數創建子進程。然后通過管道讀取子進程的輸出,并輸出到控制臺。最后清理資源。