,可以通过重定向输出流的方式实现。
首先,需要创建一个匿名管道,用于将子进程的输出流重定向到父进程。匿名管道是一种特殊的通信机制,可以在父子进程之间传递数据。
接下来,使用ShellExecute函数创建一个子进程,并将其输出流重定向到匿名管道的写入端。这样,子进程的输出就会被写入到匿名管道中。
在父进程中,可以通过读取匿名管道的读取端来获取子进程的输出。可以使用ReadFile函数从管道中读取数据,并将其存储到一个字符串中。
以下是一个示例代码,演示了如何在ShellExecute函数中将stderr和stdout转换为字符串:
#include <windows.h>
#include <iostream>
#include <string>
std::string ExecuteShellCommand(const std::string& command)
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hReadPipe, hWritePipe;
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, const_cast<LPSTR>(command.c_str()), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
CloseHandle(hWritePipe);
CloseHandle(hReadPipe);
return "";
}
CloseHandle(hWritePipe);
DWORD bytesRead;
const int bufferSize = 4096;
char buffer[bufferSize];
std::string output;
while (ReadFile(hReadPipe, buffer, bufferSize - 1, &bytesRead, NULL))
{
if (bytesRead == 0)
{
break;
}
buffer[bytesRead] = '\0';
output += buffer;
}
CloseHandle(hReadPipe);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return output;
}
int main()
{
std::string command = "your_shell_command_here";
std::string output = ExecuteShellCommand(command);
std::cout << "Command output: " << output << std::endl;
return 0;
}
在上述示例代码中,ExecuteShellCommand函数接受一个命令字符串作为参数,并返回执行该命令后的输出结果。在主函数中,可以调用ExecuteShellCommand函数来执行Shell命令,并将输出打印到控制台。
请注意,上述示例代码仅适用于Windows平台,并使用了Windows API函数。如果需要在其他操作系统上运行,需要使用相应的API函数进行重定向和读取操作。
希望这个答案能够满足你的需求。如果有任何问题,请随时提问。
领取专属 10元无门槛券
手把手带您无忧上云