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

使用ShellExecuteEx并捕获标准输入/输出/错误

作为一个云计算领域的专家,我可以告诉你,使用ShellExecuteEx并捕获标准输入/输出/错误是一种在Windows操作系统中执行外部程序的方法。ShellExecuteEx是一个Windows API函数,它允许你以异步方式执行外部程序,并且可以捕获该程序的标准输入/输出/错误流。

在使用ShellExecuteEx时,你需要提供一个完整的命令行,包括可执行文件的路径和参数。你还可以指定一个STARTUPINFO结构体,该结构体包含了一些与新进程相关的信息,例如新进程的工作目录和环境变量。ShellExecuteEx函数将返回一个PROCESS_INFORMATION结构体,该结构体包含了新进程的一些信息,例如进程ID和主线程ID。

要捕获标准输入/输出/错误流,你需要使用CreatePipe函数创建一个管道,并将其与新进程的标准输入/输出/错误流关联。你可以使用ReadFile和WriteFile函数读取和写入管道中的数据。

以下是使用ShellExecuteEx并捕获标准输入/输出/错误流的一个示例代码:

代码语言:c++
复制
#include<Windows.h>
#include<iostream>

int main()
{
    // 创建管道
    HANDLE hReadPipe, hWritePipe;
    SECURITY_ATTRIBUTES sa = {sizeof(sa), NULL, TRUE};
    CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);

    // 设置STARTUPINFO结构体
    STARTUPINFO si = {sizeof(si)};
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.hStdInput = hReadPipe;
    si.hStdOutput = hWritePipe;
    si.hStdError = hWritePipe;
    si.wShowWindow = SW_HIDE;

    // 调用ShellExecuteEx函数
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(pi));
    ShellExecuteEx(&pi, NULL, "cmd.exe", "/c dir", NULL, SW_HIDE, &si);

    // 读取输出数据
    char buffer[4096];
    DWORD bytesRead;
    while (ReadFile(hReadPipe, buffer, sizeof(buffer), &bytesRead, NULL) && bytesRead > 0)
    {
        std::cout.write(buffer, bytesRead);
    }

    // 等待进程结束
    WaitForSingleObject(pi.hProcess, INFINITE);

    // 关闭句柄
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe);

    return 0;
}

在这个示例中,我们使用ShellExecuteEx函数启动一个命令提示符窗口,并执行“dir”命令。我们将标准输入/输出/错误流都重定向到一个管道中,并使用ReadFile函数读取管道中的数据。最后,我们等待进程结束,并关闭所有句柄。

需要注意的是,使用ShellExecuteEx函数启动外部程序可能存在安全风险,因此应该谨慎使用。此外,如果你需要执行的外部程序是一个GUI程序,那么你需要使用其他方法来启动它,例如使用CreateProcess函数。

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

相关·内容

Shell标准输入、标准输出和标准错误的重定向总结

shell脚本只使用标准输入、标准输出和标准错误 Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。...标准输入是命令的输入,默认指向键盘; 标准输出是命令的输出,默认指向屏幕; 标准错误是命令错误信息的输出,默认指向屏幕。...但如果我们想从其他文件(再次强调,I/O设备在Unix/Linux中也是文件)读取输入或产生输出,就需要对0、1、2使用重定向了。...把标准输出重定向到filename2文件中 command 0 filename2 把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中 重定向的使用有如下规律...: 1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。

3.5K20
  • Python中标准输入(stdin)、标准输出(stdout)、标准错误(stdout)的用法

    1.标准输入input()、raw_input()Python 3.x 中 input() 函数可以实现提示输入,python 2.x 中要使用 raw_input(),例如:foo = input("...sys.stdin 可以获取标准输入的文件句柄对象,例如:import sysprint("Enter a line: ")line = sys.stdin.readline() # 读取一行...linelast line] 标准输出printprint 可以自动换行,例如:print("%s is %0.2f...sys.stdout 可以获取标准输出的文件句柄对象,例如:import syssys.stdout.write("%s is %0.2f, %d is a integer\n" % ("PI", 3.14...(注:write()不会自动换行,这里加了换行符)3.标准错误sys.stdout使用 sys.stderr 可以获取标准错误的文件句柄对象,示例略(将 sys.stdout 中示例中的 stdout

    41910

    FileDescriptor文件描述符 标准输入输出错误 文件描述符

    FileDescriptor  这是java层面的描述 具体的值是 0  1   2  ,这是操作系统层面的描述 在linux 中, 每个进程启动时都打开3个文件(linux 中一切都是文件):  * 标准输入...  0 * 标准输出  1 * 标准错误  2 三个描述符,通过调用私有方法 standardStream进行创建初始化 创建一个FileDescriptor 并且,设置他的...handle值 内部的set(fd)是一个本地方法 说白了,就是通过调用本地方法,获得操作系统对标准输入/输出/错误的三个文件描述符 ?...注释中也说的很清楚,文件描述符一般不直接使用通过使用System.in  System.out System.err 文件描述符在System类中的应用 在System 中   in  out err...  都是 final  static的 标准的输入输出是共享,但是java是多线程的 因此它们必须受到特别的处理,在系统初始化完成之前,线程严禁使用这几个特殊对象; 又因为这些对象都是静态的

    2K20

    K8S学习笔记之使用Fluent-bit将容器标准输入和输出的日志发送到Kafka

    0x00 概述 K8S内部署微服务后,对应的日志方案是不落地方案,即微服务的日志不挂在到本地数据卷,所有的微服务日志都采用标准输入和输出的方式(stdin/stdout/stderr)存放到管道内,容器日志采用的是...目前大部分K8S容器日志都采用Fluent或者Fluent-bit,将日志传输到ES集群,本文主要讲使用Fluent-bit将容器的日志传输到Kafka。...0x01 部署Fluent-bit并传输到Kafka 详细请看https://github.com/fluent/fluent-bit-kubernetes-logging 1.1 创建Fluent-bit...Daemonset使用的configmap $ kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging...raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/kafka/fluent-bit-ds.yaml 0x02 Fluent-bit输出方向

    2.3K30

    WinExec、ShellExecute和CreateProcess

    CreateProcess因为使用复杂,比较少用。 WinExec主要运行EXE文件。   ...当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。..., GetLastError()不一定能捕获到错误代码,例如当“d:\\tese.log”文件存在,将记事本”notepad.exe”命名为其他名字时:   另外两个函数的返回值就不列出了。...2、特殊用法   1)如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。...可以用来设置控台的标题,新窗口的的初始大小和位置,及重定向标准输入 和输出。新程序通常可以忽略多数这些数据项,如果选择那样做的话。可以规定该结构体中的标志,已表明要设置的数据段。

    1.1K20

    python模块之subprocess类与常量

    常量 subprocess.DEVNULL:可传递给stdin, stdout, stderr参数的特殊值,意味着将使用特殊文件os.devnull重定向输入输出 subprocess.PIPE:可传递给...stdin, stdout, stderr参数的特殊值,意味着使用管道重定向输入输出 subprocess.STDOUT:可传递给stderr参数的特殊值,表示重定向标准错误到标准输出 Popen 在一个新的进程中执行子程序...stdin/stdout/stderr:分别指定程序执行的标准输入,标准输出,标准错误。可选值包括PIPE,DEVNULL,已存在的文件描述符(正整数),已存在的文件对象,None。...除此之外,stderr还可以是STDOUT,表示标准错误输出重定向到标准输出。 preexec_fn:限于POSIX系统,设置一个可调用对象,先于子进程中的程序执行。...如果未捕获标准输出返回None stderr:捕获的子进程的标准错误,默认为byte类型,如果run()函数调用时指定了encoding或errors,或设置了text=True则为string类型。

    2.5K10

    有史以来最全的异常类讲解没有之一!爆肝3万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第一部分

    第二行输出是divide_numbers(10, 0)的结果,它捕捉到了ZeroDivisionError异常并打印了错误消息。...案例 # 尝试从标准输入读取数据,直到遇到EOF try: # 使用input()函数从标准输入读取一行数据 # input()函数会在用户按下Enter键后返回输入的数据...# 如果触发了EOFError异常,这行代码将捕获异常并打印错误信息 print("捕获到 EOFError 异常:输入已结束。")...user_input = input(“请输入一些数据(按Ctrl+D或Ctrl+Z+Enter结束输入):”):使用 input() 函数从标准输入读取一行数据,并提示用户输入。...然而,从Python3开始,IOError 已经被合并到 OSError 类中,因此,在Python 3及更高版本中,你应该使用 OSError来处理输入/输出相关的错误。

    15810

    Python中os.system()、subprocess.run()、call()、check_output()的用法

    subprocess.STDOUT: 用作 stderr 参数的值时,相当于把标准错误重定向到标准输入中) subprocess.DEVNULL: 用作 stdout, stderr 参数的值时,...True 了,可以通过返回值对象访问标准输出和标准错误内容shell: 当设置为 True 时,args 参数会当做一条命令字符串(支持管道、重定向操作);当它为 False 时,args 需是一个列表.../bin/sh 的输出错误 # 当 shell=False 时,是要去捕获 "abcdefg" 命令自身输出的内容,但是它不存在,python 会报错 stdout=subprocess.PIPE...,也可以将设置 stderr=subprocess.STDOUT 将标准错误重定向到标准输出,但是好像没有办法单独捕获标准错误内容呢!...run-child"] ret = subprocess.check_output(cmd, stderr=subprocess.STDOUT) print("[" + ret + "]") # 输出内容中包含标准输出和标准错误

    84220

    BI错误处理。

    在这种情况下,目标是创建新的 最终费率 列,该列将使用 标准费率 列中的值。 如果有任何错误,则它将使用“ 特率” 列中的值。...上面的公式将尝试评估 标准速率 列,并在未找到错误时输出其值。 如果在 “标准速率 ”列中找到错误,则输出将是在语句之后 otherwise 定义的值,在本例中为 “特殊速率 ”列。...这是你将创建新的自定义列并使用 try 表达式的位置。与自定义逻辑配合使用try若要创建新的自定义列,请转到 “添加列 ”菜单,然后选择“ 自定义”列。...表达式 try 将值和错误转换为记录值,该值指示表达式是否 try 处理错误,以及正确的值或错误记录。可以使用记录值展开此新创建的列,并通过选择列标题旁边的图标来查看要展开的可用字段。...现在,使用新列中的每条错误消息,可以使用名称 “最终速率 ”和以下子句创建新的条件列:如果 “所有 Errors.Errors.Message ”列中的值相等 null,则输出将是 标准速率 列中的值。

    2.8K30

    【Windows】文件类型与链接类型的默认程序

    前言 从Vista系统开始,Windows逐渐开始重视权限的管理,并陆续回收了对于默认程序的设置权限,增强了用户的体验。...(Default) 条目中提供的应用程序名称可以使用或不使用其 .exe 扩展名进行说明。 如有必要, ShellExecuteEx 函数 会在搜索 应用路径 子项时添加扩展。...默认情况下,当放置目标是可执行文件,并且未提供 DropTarget 值时,Shell 会将放置的文件列表转换为命令行参数,并通过 lpParameters 将其传递给 ShellExecuteEx。...否则,用户必须下载文件并打开本地副本。 UseUrl 条目的类型 REG_DWORD ,值为0x1。...这些项没有标准 Win32 路径,因此无法向 ShellExecuteEx 提供有意义的 lpParameters 值。

    50510

    Python 异常处理总结

    Python标准异常 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception...断言语句失败 AttributeError 对象没有这个属性 EOFError 没有内建输入,到达EOF 标记 EnvironmentError 操作系统错误的基类 IOError 输入/输出操作失败...使用except而不带任何异常类型 你可以不带任何异常类型使用except,如下实例: ? 以上方式try-except语句捕获所有发生的异常。...因为它捕获所有的异常。 使用except而带多种异常类型 你也可以使用相同的except语句来处理多个异常信息,如下所示: ?...finally块中的所有语句执行后,异常被再次提出,并执行except块代码。参数的内容不同于异常。 异常的参数 一个异常可以带上参数,可作为输出的异常信息参数。

    1.1K60

    《Go小技巧&易错点100例》第二十七篇

    错误处理:在捕获到panic或严重错误时,打印堆栈跟踪可以提供关于错误发生时的调用栈的详细信息,这有助于后续的问题分析和修复。...通常,你会将这个返回值直接输出到标准错误输出(os.Stderr)或日志文件中,以便查看。...注意,这里我们使用了 debug.PrintStack() 而不是 debug.Stack(),因为 PrintStack() 直接将堆栈跟踪输出到标准错误输出,而 Stack() 返回堆栈跟踪的字节切片...如果想要使用 debug.Stack() 并手动处理堆栈跟踪信息,你可以这样做:stack := debug.Stack()// 将 stack 输出到日志系统、文件或其他目的地fmt.Fprint(os.Stderr...使用条件编译的注意事项1)条件编译应该谨慎使用,因为它会使代码库变得更加复杂,并增加维护成本。2)在使用构建标签时,要确保它们正确无误,并且不会意外地排除或包含错误的文件。

    8930

    关于Python异常处理,你需要了解的知识点

    这时候,就需要捕获处理它,否则程序会终止执行。 异常处理 使用try/except/finally语句进行捕获操作,并告诉Python发生异常时如何处理。...异常/错误 as 别名,使用别名接收异常对象的错误信息。...如何捕获多个异常? 1.写出多行except 异常/错误,指定捕获多个不同类型的异常。2.使用 except (异常1,异常2..),使用元组,在一行中捕获多个不同类型的异常。...Python标准异常 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception...断言语句失败 AttributeError 对象没有这个属性 EOFError 没有内建输入,到达EOF 标记 EnvironmentError 操作系统错误的基类 IOError 输入/输出操作失败

    1.4K61

    使用Python捕获和处理异常日志

    当我们的程序运行时发生错误或异常,及时捕获并记录异常日志可以帮助我们快速定位和解决问题,提升程序的稳定性和可靠性。...本文将介绍如何使用Python来捕获和处理异常日志,帮助读者更好地理解和应用异常处理的技术。...例如,我们写一段除法的程序,输入被除数除数,并输出商并打印,代码如下: def Get_quotient(): a=input("请输入被除数") b=input('请输入除数')...Python标准库提供了logging模块,让我们也可以方便的在Python中打印日志。...通过Python的异常处理机制,我们可以捕获和处理程序运行过程中的异常情况,并记录相关的日志信息,帮助定位和解决问题。希望本文可以帮到大家!

    14710

    【笔记】《C++Primer》—— 第10章:泛型算法

    比较默认是使用输入新的可调用对象(如函数)来自定义默认行为,这个参数称为“谓词” 谓词是一个可调用的表达式,标准库中的谓词分接受一个参数的一元谓词和接受两个参数的二元谓词...vec3, vec3.begin())); 注意对插入迭代器进行++,--是无意义的,只是为了统一通用而存在 流迭代器有两种类型,istream_iterator和ostream_iterator,它们使用输入输出运算符来处理流...,递增移动,解引用(处于右侧) 输出迭代器用于对元素进行改变,相当于输入迭代器的补集,注意我们只能对一个输出迭代器赋值一次,需要支持:递增移动,解引用(处于左侧) 前向迭代器可以顺序读写元素,我们可以对此迭代器进行保存和多次使用...随机访问迭代器提供在常量时间内访问序列中任意元素的能力,同时支持了:比较迭代器之间位置的运算,迭代器与一个整数的位置加减运算,下标运算 知道了迭代器的分类后就可想而知算法大概会需要什么迭代器才能运行(迭代器错误时会报错并产生相应的错误提示...,这些函数通常来说性能比标准库的通用函数更好,应尽可能使用 ?

    66720
    领券