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

Posted

技术标签:

【中文标题】将输入传递给由 CreateProcess() 创建的进程【英文标题】:Passing an input to the process created by CreateProcess() 【发布时间】:2011-02-19 16:21:11 【问题描述】:

就像标题一样,我想知道是否可以通过在 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 管道的魔术吗,坦率地说我想避免。干杯。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

为了让事情变得更复杂,我只能操纵lpCommandLine 参数而无需进行任何深入的修改。我尝试了CreateProcess(NULL, "c:\\somebatch.bat c:\\app.exe c:\\input.txt", ...);,如 cmets 中所述,其中somebatch.bat 内容为%1 < %2,但没有成功。唯一没有存储空间不足的警告。无论如何感谢您的提示!【参考方案2】:

你有什么理由需要CreateProcess吗?

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

【讨论】:

不可能使用system()函数

以上是关于将输入传递给由 CreateProcess() 创建的进程的主要内容,如果未能解决你的问题,请参考以下文章

Vuetify - 将道具传递给由 router-link 创建的标签

将 apache2 摘要身份验证信息传递给由 mod_wsgi 运行的 wsgi 脚本

使用 Typescript 将 props 传递给由 styled-components 包装的 material-ui 按钮

如何将 std::string 环境块传递给 CreateProcess?

将 STARTF_USESTDHANDLES 标志与 CreateProcess() 一起使用时将套接字传递给子进程时出错

将值分配给由字符串名称动态确定的淘汰赛 observable