我这样做:
if (!CreateProcessA(NULL, lArgs, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &StartupInfo, &ProcessInfo))
{
free(lArgs);
return GetLastError();
}
但我不知道如何从控制台获取输入。
我有责任为它写一个文件吗?
编辑1:没有问题,它有效(代码是C和C ++)。 这创建了一个控制台,我正在寻找的是: 如何在此范围内从此新控制台获取用户输入? lArgs包含我传递给这个新控制台的参数/命令行。
编辑2 :(我没有遇到任何麻烦。它工作正常。)子进程是一个控制台,我试图在控制台(子进程)中获取父进程的用户输入。 / p>
编辑3:子进程只是一个控制台,如" CREATE_NEW_CONSOLE"。命令行将通过lArgs提供给控制台。此命令运行一个程序,其结果显示在此新控制台中。如果我使用_popen(我不想)而不是createprocess,这个显示的结果由_popen返回,但是使用createprocess,它似乎就丢失了。
答案 0 :(得分:1)
行;似乎这里的问题是你对这个术语感到绝望。
CREATE_NEW_CONSOLE
does not mean what you think it means中的“控制台”一词。没有进程是控制台;控制台是具有的进程。具体来说,控制台是基于文本的窗口,命令行应用程序(包括但不限于命令解释程序)用于输入和输出。 CREATE_NEW_CONSOLE
标志向系统说“为此子进程创建一个新的控制台窗口,而不是使用我的”。
显然,您要做的是启动一个新的命令解释程序。您不需要CREATE_NEW_CONSOLE
标志来执行此操作。
(请注意,如果您实际想要运行的程序是可执行文件,则根本不需要命令解释程序,无论您是否希望程序具有单独的控制台。任何可执行文件,包括命令-line可执行文件,可以独立运行,不需要将命令解释程序作为父项。一般来说,只有当你想运行批处理文件时才会启动一个新的命令解释程序作为子进程;为了参数,我会假设你正在做的事情。)
此外,短语“用户输入”仅表示用户为程序提供的输入。在这种情况下,人们在键盘上键入的东西。子进程,无论是命令解释器还是其他程序,都不是用户,在您的情况下,它生成输出而不是接受输入。所以您想要的是子进程输出,或者在这种情况下,您也可以将其描述为命令解释器输出。
所以,你想问的问题是:
我正在使用CreateProcess启动命令解释器,我希望输出转到我的控制台而不是新的控制台。我怎么能这样做?
答案是:这是默认行为。带走CREATE_NEW_CONSOLE
标志,该标志明确告诉Windows完全按照您的要求执行操作,并且它将以您希望的方式运行。
答案 1 :(得分:-1)
您可以改用_popen。它将返回用户的命令行输入。