将输入传递给由 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() 一起使用时将套接字传递给子进程时出错