将输入传递给CreateProcess()创建的进程

时间:2011-02-19 16:21:12

标签: c++ winapi process input

就像在标题中我想知道是否可以通过在CreateProcess()中使用重定向运算符来传递输入。我试过以下的东西:

CreateProcess(NULL, "%ComSpec% /c c:\\somebatch.bat", NULL, NULL, ...);

其中somebatch.bat包含c:\app.exe < c:\input.txt并且未传递输入,只需启动app.exe。在输出上它说:

c:\working_directory> c:\app.exe < c:\input.txt

c:\working_directory>Not enough storage is available to process this command.

(弄乱irpcstack并没有帮助)

你们是否知道任何魔术可以让我做我想要的而不会弄乱hStdInput管道,坦率地说我想避免。欢呼声。

2 个答案:

答案 0 :(得分:0)

我已经做了一段时间了,但你必须在传递的STARTUPINFO struct中设置hStdInput成员作为CreateProcess的倒数第二个参数。我很确定没有其他好方法可以做到这一点。使用hStdInput非常简单,打开要用作输入的文件,将hStdInput设置为文件句柄,创建进程并关闭句柄。

您可以打开输入文件,将句柄复制到当前流程标准输入中,然后创建将bInheritHandles设置为TRUE的流程。然后,您的程序将通过stdin简单地接收文件内容。我从未在Windows中尝试过这种方法,但这在基于UNIX的平台上很常见。

至于运行批处理文件,请阅读MSDN entry for CreateProcess中的注释。我认为你的论点搞砸了。

答案 1 :(得分:0)

您有什么理由需要CreateProcess吗?

system函数使用默认shell(因此您不需要放入%ComSpec%),这意味着重定向可以正常工作。它也更容易使用,更便携。如果您只是等待该过程完成,请考虑改为使用system