阅读量:3
要使用ShellExecuteEx函数来捕获标准输入/输出/错误,你需要使用匿名管道来实现。以下是一个示例代码:
#include <windows.h> #include <iostream> #include <string> // 函数用于创建匿名管道 bool CreatePipeHandles(HANDLE& hReadPipe, HANDLE& hWritePipe) { SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; // 创建管道 if (!CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0)) { std::cout << "Failed to create pipe." << std::endl; return false; } // 设置管道的继承属性 if (!SetHandleInformation(hReadPipe, HANDLE_FLAG_INHERIT, 0)) { std::cout << "Failed to set handle information." << std::endl; return false; } return true; } // 函数用于执行Shell命令并捕获标准输入/输出/错误 bool ExecuteCommand(const std::string& command, std::string& output) { HANDLE hReadPipe, hWritePipe; // 创建管道 if (!CreatePipeHandles(hReadPipe, hWritePipe)) { return false; } // 创建进程信息结构体 STARTUPINFOA si; ZeroMemory(&si, sizeof(STARTUPINFOA)); si.cb = sizeof(STARTUPINFOA); si.hStdError = hWritePipe; si.hStdOutput = hWritePipe; si.hStdInput = hReadPipe; si.dwFlags |= STARTF_USESTDHANDLES; // 创建进程信息结构体 PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); // 启动Shell命令 if (!CreateProcessA(NULL, const_cast<LPSTR>(command.c_str()), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { std::cout << "Failed to execute command." << std::endl; return false; } // 关闭无用的管道句柄 CloseHandle(hReadPipe); CloseHandle(hWritePipe); // 等待进程执行完成 WaitForSingleObject(pi.hProcess, INFINITE); // 读取管道中的输出数据 char buffer[4096]; DWORD bytesRead; while (ReadFile(si.hStdOutput, buffer, sizeof(buffer) - 1, &bytesRead, NULL) && bytesRead != 0) { buffer[bytesRead] = '\0'; output += buffer; } // 关闭进程和线程句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return true; } int main() { std::string command = "dir"; // 你可以修改为你想要执行的Shell命令 std::string output; if (ExecuteCommand(command, output)) { std::cout << "Command output:" << std::endl; std::cout << output << std::endl; } return 0; }
在上面的示例代码中,CreatePipeHandles函数用于创建匿名管道,ExecuteCommand函数用于执行Shell命令并捕获标准输入/输出/错误。你可以将command变量修改为你想要执行的Shell命令。执行完成后,输出将被存储在output字符串中,并打印到控制台上。