CreatePipe函數用于創建一個匿名管道,CreateProcess函數用于創建一個新的進程。下面是它們的使用方法:
【CreatePipe函數】
BOOL CreatePipe(
PHANDLE hReadPipe,
PHANDLE hWritePipe,
LPSECURITY_ATTRIBUTES lpPipeAttributes,
DWORD nSize
);
hReadPipe和hWritePipe:接收創建的匿名管道的句柄,一個用于讀取數據,一個用于寫入數據。
lpPipeAttributes:指向SECURITY_ATTRIBUTES結構的指針,用于指定管道的安全屬性。如果為NULL,則默認為不繼承句柄。
nSize:指定管道的緩沖區大小,如果為0,則使用默認大小。
【CreateProcess函數】
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
lpApplicationName:可執行文件的名稱(可選)。
lpCommandLine:命令行參數。
lpProcessAttributes和lpThreadAttributes:指向SECURITY_ATTRIBUTES結構的指針,用于指定進程和線程的安全屬性。
bInheritHandles:指示新進程是否繼承父進程的句柄。
dwCreationFlags:指定進程的創建標志。
lpEnvironment:指定新進程的環境變量(可選)。
lpCurrentDirectory:指定新進程的當前工作目錄(可選)。
lpStartupInfo:指向STARTUPINFO結構的指針,用于指定新進程的主窗口外觀和其他屬性。
lpProcessInformation:指向PROCESS_INFORMATION結構的指針,用于接收新進程的相關信息,如進程句柄、主線程句柄等。
使用示例:
HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE; // 允許子進程繼承句柄
sa.lpSecurityDescriptor = NULL;
// 創建管道
if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) {
// 處理創建管道失敗的情況
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.hStdError = hWritePipe; // 將標準錯誤輸出重定向到管道寫入端
si.hStdOutput = hWritePipe; // 將標準輸出重定向到管道寫入端
si.dwFlags |= STARTF_USESTDHANDLES; // 使用重定向句柄
// 創建進程
if (!CreateProcess(NULL, // 不指定可執行文件的名稱
"executable.exe", // 命令行參數
NULL, // 進程安全屬性
NULL, // 線程安全屬性
TRUE, // 繼承句柄
0, // 創建標志
NULL, // 環境變量
NULL, // 當前工作目錄
&si, // STARTUPINFO
&pi // PROCESS_INFORMATION
)) {
// 處理創建進程失敗的情況
return;
}
// 關閉管道的讀端和寫端
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
在上面的示例中,CreatePipe函數被用于創建一個匿名管道,其中hReadPipe用于讀取數據,hWritePipe用于寫入數據。CreateProcess函數創建一個新的進程,并將標準輸出和標準錯誤輸出重定向到管道的寫入端,使得子進程的輸出可以通過管道傳遞給主進程。最后,通過CloseHandle函數關閉管道的讀端和寫端。