首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在ShellExecute函数中将stderr和stdout转换为字符串

,可以通过重定向输出流的方式实现。

首先,需要创建一个匿名管道,用于将子进程的输出流重定向到父进程。匿名管道是一种特殊的通信机制,可以在父子进程之间传递数据。

接下来,使用ShellExecute函数创建一个子进程,并将其输出流重定向到匿名管道的写入端。这样,子进程的输出就会被写入到匿名管道中。

在父进程中,可以通过读取匿名管道的读取端来获取子进程的输出。可以使用ReadFile函数从管道中读取数据,并将其存储到一个字符串中。

以下是一个示例代码,演示了如何在ShellExecute函数中将stderr和stdout转换为字符串:

代码语言:cpp
复制
#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函数进行重定向和读取操作。

希望这个答案能够满足你的需求。如果有任何问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CC 中一次性执行多个DOS命令的实现思路

好吧,我就在网上到处找batexe的工具,找了很久,都没有找到合适的,只有一个用winrar制作自解压包的方法还算可以,但是这玩意儿有两个坑爹的问题: 使用了自定义图标后,安装时会被360报告有木马;...思路 C语言中执行DOS命令的方法很多,如:ShellExecute, WinExec, CreateProcess等,但是这些接口都是只能一次执行一条命令,我的启动脚本里有很多命令,有一些是设置环境变量的...,这样就没法代码中一条条执行脚本中的命令,必须要找到一个办法可以一次性执行多条命令。...// 这个结构为很多函数创建对象时提供安全性设置 SECURITY_ATTRIBUTES saAttr; BOOL fSuccess; // Set the bInheritHandle flag...sizeof(PROCESS_INFORMATION) ); // Set up members of the STARTUPINFO structure. // 设定DOS进程的标准输入、输出错误信息的管道

17830

TCPIP网络编程-4~9章学习笔记

前置C语言小知识点 stdin,stdoutstderr 名称 全称 含义 stdin standard input 标准输入流 stdout standard out 标准输出流 stderr standard...char message[BUF_SIZE]; fputs("请向输入流一个字符串:", stdout); //printf fgets(message, BUF_SIZE,...stdin); //scanf fputs(message,stderr); //output: message } 上面我们使用到了stdout、 stdin, 并且最后还写入到 stderr...流, 输出到了控制台. stdoutstderr都能输出到控制台, 除了语义上区别外, stderr是没有缓冲的,他立即输出,而stdout默认是行缓冲,也就是它遇到‘\n’,才向外输出内容,如果你想...in_addr 结构体, 再调用inet_ntoa转换为字符串形式 printf("Ip addr: %s\n", inet_ntoa(*(struct in_addr *)host-

44730

Python基础之:Python中的IO

linux输入输出 linux中有三种标准输入输出,分别是STDIN,STDOUTSTDERR,对应的数字是0,1,2。...STDIN是标准输入,默认从键盘读取信息; STDOUT是标准输出,默认将输出结果输出至终端; STDERR是标准错误,默认将输出结果输出至终端。...我们看下print函数的定义: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) print函数将 objects 打印到...f格式化 如果想要格式化字符串,可以字符串的开始引号之前加上 f 或 F。 这样的话,我们可以直接在字符串中引入变量值,只需要把变量放在 { } 中间即可。...当一个对象被转化为 JSON 时,字典中所有的键都会被强制转换为字符串。这所造成的结果是字典被转换为 JSON 然后转换回字典时可能原来的不相等。

69620

Python基础之:Python中的IO

linux输入输出 linux中有三种标准输入输出,分别是STDIN,STDOUTSTDERR,对应的数字是0,1,2。...STDIN是标准输入,默认从键盘读取信息; STDOUT是标准输出,默认将输出结果输出至终端; STDERR是标准错误,默认将输出结果输出至终端。...我们看下print函数的定义: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) print函数将 objects 打印到...f格式化 如果想要格式化字符串,可以字符串的开始引号之前加上 f 或 F。 这样的话,我们可以直接在字符串中引入变量值,只需要把变量放在 { } 中间即可。...如果我们只是想要将Python对象转换为字符串,那么可以使用repr()或者str(), str() 函数是用于返回人类可读的值的表示,而 repr()是用于生成解释器可读的表示。

57320

标准 IO 库那些事儿

三个例外是标准输入 stdin、标准输出 stdout、标准错误 stderr,它们进入 main 时就准备好了,可以直接使用,与之对应的文件描述符分别是 STDIN_FILENO / STDOUT_FILENO...freopen freopen 一般用于将一个指定的文件打开为一个预定义的流,使用方式上有些类似 dup2: 如果 stream 代表的流已经打开,则先关闭 打开成功后返回 stream 如果想在程序中将...的结果就不太一样了,缓冲区地址大小均未改变,仅缓冲类型发生变更 setvbuf 设置 stdout 全缓冲、设置 stderr 行缓冲不带 buf (NULL) 0 size 的结果同上,缓冲区地址大小均未改变...换作为了 va_list,适用于已经将变长参数转换为 va_list 的场景,因为这一换是单向的。...整个过程只操作用户提供的存储空间,既无静态存储区,也无内存的分配释放,存储空间方面几乎是最优雅的解决方案。

1.4K20

Python基础之:Python中的IO

linux输入输出 linux中有三种标准输入输出,分别是STDIN,STDOUTSTDERR,对应的数字是0,1,2。...STDIN是标准输入,默认从键盘读取信息; STDOUT是标准输出,默认将输出结果输出至终端; STDERR是标准错误,默认将输出结果输出至终端。...我们看下print函数的定义: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) print函数将 objects 打印到...f格式化 如果想要格式化字符串,可以字符串的开始引号之前加上 f 或 F。 这样的话,我们可以直接在字符串中引入变量值,只需要把变量放在 { } 中间即可。...当一个对象被转化为 JSON 时,字典中所有的键都会被强制转换为字符串。这所造成的结果是字典被转换为 JSON 然后转换回字典时可能原来的不相等。

72540

Python基础之:Python中的IO

linux输入输出 linux中有三种标准输入输出,分别是STDIN,STDOUTSTDERR,对应的数字是0,1,2。...STDIN是标准输入,默认从键盘读取信息; STDOUT是标准输出,默认将输出结果输出至终端; STDERR是标准错误,默认将输出结果输出至终端。...我们看下print函数的定义: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) 复制代码 print函数将 objects...f格式化 如果想要格式化字符串,可以字符串的开始引号之前加上 f 或 F。 这样的话,我们可以直接在字符串中引入变量值,只需要把变量放在 { } 中间即可。...当一个对象被转化为 JSON 时,字典中所有的键都会被强制转换为字符串。这所造成的结果是字典被转换为 JSON 然后转换回字典时可能原来的不相等。

57410

python中的subprocess

字符串将被视为只有一个字符串的序列(程序执行)。 UNIX上,shell= True:如果参数是一个字符串,它指定了通过shell执行命令字符串。...stdin、stdoutstderr分别指定执行程序的标准输入,标准输出标准错误。有效值是PIPE,现有的文件描述符(正整数),现有文件对象,None。PIPE创建一个新的子管道。...CalledProcessError的对象将有返回代码returncode属性输出在output属性     这些参数相对于Popen构造函数是相同的。    ...可选的input参数应该是发送给子进程的字符串,或者如果没有要发送给子进程的数据那就用None      communicate() 返回一个元组 (stdout, stderr).     ...=STDOUT, close_fds=True) (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) Unix系统中,

1.6K30
领券