【问题标题】:Using ShellExecuteEx and capturing standard in/out/err使用 ShellExecuteEx 并捕获标准输入/输出/错误
【发布时间】:2010-10-02 22:04:43
【问题描述】:

我正在使用 ShellExecuteEx 在 C 中执行命令。有没有办法使用 ShellExecuteEx 并捕获标准输入/输出/错误?

注意:我不想使用CreateProcess

【问题讨论】:

    标签: c++ c windows winapi


    【解决方案1】:

    我曾经像你一样发现问题。

    假设,您想从 STDOUT 中捕获由 dir 命令生成的输出,并将捕获的结果保存到 out.txt 中。

    1. 使用文本编辑器并输入 dir > out.txt 并使用 mybat.bat 保存(*.bat,不要 *.txt)

    2. 在您的 c/c++ 程序中,键入 WinExec("mybat.bat", SW_HIDE); 并运行您的应用程序。

    3. 打开out.txt你会看到当前目录下的文件夹和文件的名称。

    此外,您可以按照以下相同的方式运行任何可执行文件(*.exe)。

    xxx.exe > out.txt

    希望对你有所帮助。 对不起,我的英语真的不好。

    【讨论】:

      【解决方案2】:

      没有。这样做的唯一方法是使用CreatePipeCreateProcess。请参阅 MSDN 文章here

      【讨论】:

        【解决方案3】:

        这是不可能的。 ShellExecute(Ex) 基本上是在 shell 的上下文中执行应用程序 - 所以你基本上是在做 explorer 所做的事情。

        捕获 STDIN 和 STDOUT 是 shell 通常不做的事情,你将不得不走 CreateProcess 路线(毕竟,如果要执行的文件是一个程序和动词是“开放”)。

        【讨论】:

          【解决方案4】:

          正如 pilif 和 Bob 所说,您需要使用 CreateProcess

          如果您想要为您打包的代码,我确实有一个针对这个确切问题的课程:

          http://code.google.com/p/kgui/source/browse/trunk/kguithread.cpp

          类 (kGUICallThread) 处理 Linux、macOS 和 Windows 版本。该代码已获得 LGPL 许可。

          【讨论】:

          【解决方案5】:

          CreateProcess 是大多数人使用的。

          您可能还想考虑使用 _popen

          http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.80%29.aspx

          【讨论】:

            猜你喜欢
            • 2013-05-11
            • 2017-07-21
            • 1970-01-01
            • 2011-04-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-04
            相关资源
            最近更新 更多