c++ - 使用 CREATE_NEW_CONSOLE 从 CreateProcess 获取用户输入

标签 c++ c windows console createprocess

我这样做:

if (!CreateProcessA(NULL, lArgs, NULL, NULL, FALSE,
    CREATE_NEW_CONSOLE, NULL, NULL, &StartupInfo, &ProcessInfo))
{
    free(lArgs);
    return GetLastError();
}

但我不知道如何从控制台获取输入。

我有义务为其编写一个文件吗?

编辑1:没有问题,它可以工作(并且代码是C和C++)。 这创建了一个控制台,我正在寻找的是: 我如何在这个范围内从这个新控制台获取用户输入? lArgs 包含我传递给这个新控制台的参数/命令行。

编辑2:(我没有任何麻烦。它工作正常。)子进程是一个控制台,我试图将控制台(子进程)中的用户输入获取到父进程。

编辑3:子进程只是一个控制台,如“CREATE_NEW_CONSOLE”中所示。命令行通过 lArgs 提供给控制台。此命令运行一个程序,其结果显示在这个新控制台中。如果我使用 _popen (我不想)而不是 createprocess,则显示的结果将由 _popen 返回,但使用 createprocess 时,它似乎会丢失。

最佳答案

好的;看来这里的问题是您对术语感到非常困惑。

CREATE_NEW_CONSOLE 中的“控制台”一词 does not mean what you think it means 。没有一个进程是控制台;控制台是进程所拥有的东西。具体来说,控制台是命令行应用程序(包括但不限于命令解释器)用于输入和输出的基于文本的窗口。 CREATE_NEW_CONSOLE 标志告诉系统“为此子进程创建一个新的控制台窗口,而不是使用我的”。

显然,您想要做的是启动一个新的命令解释器。您不需要 CREATE_NEW_CONSOLE 标志来执行此操作。

(请注意,如果您实际要运行的程序是可执行文件,则根本不需要命令解释器,无论您是否希望该程序有单独的控制台。任何可执行文件,包括命令-line可执行文件,可以独立运行,不需要命令解释器作为父进程。一般来说,只有当你想运行批处理文件时,你才会启动一个新的命令解释器作为子进程;为了论证,我假设这就是你正在做的事情。)

此外,短语“用户输入”的意思就是 - 用户向程序提供的输入。在这种情况下,指的是一个人在键盘上键入的内容。子进程,无论是命令解释器还是其他程序,都不是用户,在您的情况下,它正在生成输出而不是接受输入。因此,您想要的称为子进程输出,或者在这种情况下,您也可以将其描述为命令解释器输出

所以,你想问的问题是:

I am launching a command interpreter with CreateProcess and I want the output to go to my console rather than to the new console. How can I do this?

答案是:这是默认行为。去掉 CREATE_NEW_CONSOLE 标志,该标志明确告诉 Windows 完全执行您不希望它执行的操作,并且它将按照您希望的方式运行。

关于c++ - 使用 CREATE_NEW_CONSOLE 从 CreateProcess 获取用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39526027/

相关文章:

c++ - MMDevice API 中的 CoCreateInstance 返回错误代码 0x800401F0

嵌入式目标上的 C++ : Low overhead storage backend

c - pthread 中的信号处理

windows - 如何在 Mac 上运行 Jmeter 窗口脚本

c++ - Qt cpp - 将 QString 写入文本文件的简洁方法

将一定数量的字符从一个指针复制到另一个指针

c - 如果 `"转换为 "` exist in `,为什么 `char` %c `int` printf`?

windows - WinInet::InternetSetOption(...) 始终返回 0,GetLastError() 返回 12018

c# - 在托管服务中检测到 CRT 调试堆损坏

c++ - 扩展基类并维护引用