CreatePipe和CreateProcess函數(shù)怎么使用

小億
145
2023-09-28 21:45:00

CreatePipe函數(shù)用于創(chuàng)建一個(gè)匿名管道,CreateProcess函數(shù)用于創(chuàng)建一個(gè)新的進(jìn)程。下面是它們的使用方法:

【CreatePipe函數(shù)】

BOOL CreatePipe(
PHANDLE               hReadPipe,
PHANDLE               hWritePipe,
LPSECURITY_ATTRIBUTES lpPipeAttributes,
DWORD                 nSize
);
  • hReadPipe和hWritePipe:接收創(chuàng)建的匿名管道的句柄,一個(gè)用于讀取數(shù)據(jù),一個(gè)用于寫(xiě)入數(shù)據(jù)。

  • lpPipeAttributes:指向SECURITY_ATTRIBUTES結(jié)構(gòu)的指針,用于指定管道的安全屬性。如果為NULL,則默認(rèn)為不繼承句柄。

  • nSize:指定管道的緩沖區(qū)大小,如果為0,則使用默認(rèn)大小。

【CreateProcess函數(shù)】

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:可執(zhí)行文件的名稱(chēng)(可選)。

  • lpCommandLine:命令行參數(shù)。

  • lpProcessAttributes和lpThreadAttributes:指向SECURITY_ATTRIBUTES結(jié)構(gòu)的指針,用于指定進(jìn)程和線程的安全屬性。

  • bInheritHandles:指示新進(jìn)程是否繼承父進(jìn)程的句柄。

  • dwCreationFlags:指定進(jìn)程的創(chuàng)建標(biāo)志。

  • lpEnvironment:指定新進(jìn)程的環(huán)境變量(可選)。

  • lpCurrentDirectory:指定新進(jìn)程的當(dāng)前工作目錄(可選)。

  • lpStartupInfo:指向STARTUPINFO結(jié)構(gòu)的指針,用于指定新進(jìn)程的主窗口外觀和其他屬性。

  • lpProcessInformation:指向PROCESS_INFORMATION結(jié)構(gòu)的指針,用于接收新進(jìn)程的相關(guān)信息,如進(jìn)程句柄、主線程句柄等。

使用示例:

HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE; // 允許子進(jìn)程繼承句柄
sa.lpSecurityDescriptor = NULL;
// 創(chuàng)建管道
if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) {
// 處理創(chuàng)建管道失敗的情況
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.hStdError = hWritePipe; // 將標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到管道寫(xiě)入端
si.hStdOutput = hWritePipe; // 將標(biāo)準(zhǔn)輸出重定向到管道寫(xiě)入端
si.dwFlags |= STARTF_USESTDHANDLES; // 使用重定向句柄
// 創(chuàng)建進(jìn)程
if (!CreateProcess(NULL,   // 不指定可執(zhí)行文件的名稱(chēng)
"executable.exe",      // 命令行參數(shù)
NULL,                   // 進(jìn)程安全屬性
NULL,                   // 線程安全屬性
TRUE,                   // 繼承句柄
0,                      // 創(chuàng)建標(biāo)志
NULL,                   // 環(huán)境變量
NULL,                   // 當(dāng)前工作目錄
&si,                    // STARTUPINFO
&pi                     // PROCESS_INFORMATION
)) {
// 處理創(chuàng)建進(jìn)程失敗的情況
return;
}
// 關(guān)閉管道的讀端和寫(xiě)端
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);

在上面的示例中,CreatePipe函數(shù)被用于創(chuàng)建一個(gè)匿名管道,其中hReadPipe用于讀取數(shù)據(jù),hWritePipe用于寫(xiě)入數(shù)據(jù)。CreateProcess函數(shù)創(chuàng)建一個(gè)新的進(jìn)程,并將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到管道的寫(xiě)入端,使得子進(jìn)程的輸出可以通過(guò)管道傳遞給主進(jìn)程。最后,通過(guò)CloseHandle函數(shù)關(guān)閉管道的讀端和寫(xiě)端。

0