下面是一个用 C++ 编写的示例代码,展示了如何创建一个管道父应用,发出命令 dir
运行子应用 cmd.exe
并获取子应用的响应。
#include <windows.h>
#include <iostream>
#include <string>
int main() {
// 创建管道
HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) {
std::cerr << "CreatePipe failed." << std::endl;
return 1;
}
// 设置子进程的安全属性
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.hStdOutput = hWritePipe; // 将子进程的标准输出重定向到管道
si.hStdError = hWritePipe; // 将子进程的标准错误重定向到管道
si.dwFlags |= STARTF_USESTDHANDLES;
// 创建子进程
if (!CreateProcess(NULL, (LPSTR)"cmd.exe /C dir", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
std::cerr << "CreateProcess failed." << std::endl;
return 1;
}
// 关闭写入端
CloseHandle(hWritePipe);
// 读取子进程的输出
char buffer[128];
std::string output;
DWORD bytesRead;
while (ReadFile(hReadPipe, buffer, sizeof(buffer) - 1, &bytesRead, NULL) && bytesRead > 0) {
buffer[bytesRead] = '\0'; // 确保字符串以 null 结尾
output += buffer; // 将输出追加到字符串
}
// 关闭读取端和子进程句柄
CloseHandle(hReadPipe);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
// 输出子进程的响应
std::cout << "Output from cmd.exe:\n" << output << std::endl;
return 0;
}
代码说明:
- 创建管道:使用
CreatePipe
函数创建一个管道,用于父进程和子进程之间的通信。 - 设置子进程的标准输出:通过
STARTUPINFO
结构体将子进程的标准输出和标准错误重定向到管道的写入端。 - 创建子进程:使用
CreateProcess
函数启动cmd.exe
,并执行dir
命令。 - 读取输出:从管道的读取端读取子进程的输出,并将其存储在字符串中。
- 输出结果:最后,将子进程的输出打印到控制台。
请确保在 Windows 环境中编译和运行此代码。