C++ 无法读取在cmd.exe管道下启动的进程的输出

C++ 无法读取在cmd.exe管道下启动的进程的输出,c++,winapi,visual-c++,cmd,C++,Winapi,Visual C++,Cmd,我希望你的节目进展顺利 由于我缺乏知识,我有一个问题希望能得到一个简单的答案 我使用了这个问题中的代码- 一切都很顺利 问题是,当我从cmd.exe shell运行其他需要交互的命令时,例如python或powershell,我会得到初始输出,但不会向管道写入任何内容 这就是我的输入/输出的样子: static PCSTR commands[] = { "powershell\r\n", "dir\r\n", "help\r\n"}; ULONG n = RTL_NUMBER_OF(comman

我希望你的节目进展顺利

由于我缺乏知识,我有一个问题希望能得到一个简单的答案

我使用了这个问题中的代码-

一切都很顺利

问题是,当我从cmd.exe shell运行其他需要交互的命令时,例如python或powershell,我会得到初始输出,但不会向管道写入任何内容

这就是我的输入/输出的样子:

static PCSTR commands[] = { "powershell\r\n", "dir\r\n", "help\r\n"};
ULONG n = RTL_NUMBER_OF(commands);
PCSTR* psz = commands;
do 
{
    if (MessageBoxW(0,0, L"force close ?", MB_YESNO) == IDYES)
    {
        DisconnectNamedPipe(hFile);
        break;
    }
    if (p = new U_IRP(&obj))
    {
        PCSTR command = *psz++;
        p->Write(command, (ULONG)strlen(command) * sizeof(CHAR));
        p->Release();
    }
} while (--n)
当代码运行时,我也会得到初始的powershell.exe提示符

PS C:\Users>
但在那之后,没有任何东西被写入管道

代码正在使用CreateProcess(…“cmd.exe”…),我尝试将其从“cmd.exe”更改为“cmd.exe/c”和“cmd.exe/k”,两者都不起作用

也许您知道我需要从CreateProcess()诱导的管道对python或powershell之类的解释文件执行读/写输出?谢谢你的帮助

执行cmd.exe并通过管道将命令发送到exec powershell。然后,所有这些都依赖于powershell实现

在window7上:

powershell使用
ReadConsoleW
获取输入。所以它不会使用你命名的管道-不会从中读取。您可以注意到,在执行powershell之后,console窗口将变为交互式窗口。所以powershell不接受您写入管道的内容(它根本不从中读取),而是从屏幕读取用户输入。但是,在手动向控制台输入一些命令并按enter键后,可以获得管道输出-powershell使用(混合)-
WriteFile
WriteConsoleW
进行输出。一些信息通过
WriteFile
输出,一些信息通过
WriteConsoleW

在windows10上:

powershell使用
ReadFile
获取输入。和输出的
WriteFile
。所以它从管道中读取命令并将结果写入其中。一切都很完美。您还可以注意到,在这种情况下,控制台窗口处于非活动状态-您不能向其输入任何文本(与win7不同)


所以代码都是绝对ok。问题仅限于第三方程序如何读取和写入数据。如果它没有从你的管道中读取-你在这里什么也做不了

至少显示U_IRP的代码和调用CreateProcess的片段。但更好的是,阅读并提供一个。寻求调试帮助的问题必须包括具体问题以及在问题本身中重现问题所需的最短代码。请阅读如何创建and.C!=C++。只使用您正在使用的语言进行标记,除非两者都是相关的。两者都是相关的,如果您单击我发布的链接,则完整的代码就在那里。
do{…}
忽略了
while
-statement.will,因为我知道其他程序也可以做到这一点。你是说这是不可能的吗?@TimCollins-什么是不可能的?如果程序使用
ReadConsoleW
而不是
ReadFile
,您可以在这里做什么?当然,如果存在一些命令行开关来选择
ReadConsoleW
vs
ReadFile
,但我对此表示怀疑,如果应用程序在连接到控制台时调用
ReadConsoleW
,请尝试使用创建标志
分离的\u进程运行它(即,不要自动继承或分配控制台)。如果失败,如果您提前知道这一点,请确保连接到同一控制台,并通过
WriteConsoleInput
写入输入缓冲区。如果它也在写入控制台屏幕缓冲区,在简单的情况下,您可以调用
CreateConsolesScreenbuffer
并将其设置为9999行,所有行都初始化为NUL,将其临时设置为活动屏幕,等待进程,然后通过
ReadConsoleOutputCharacter
读取输出。但是,如果您需要超过9999行的输出,这并不是那么简单。@eryksun-如何使用分离的\u进程标志运行powershell?我不是通过CreateProcess()调用powershell,而是从命令行调用它。调用CreateProcess(cmd.exe,DETACHED_PROCESS)会导致powershell与管道完全分离,不再提供任何输出,甚至第一行也不提供,并在自己的窗口中打开,这是我不希望看到的。。。所以如果你说的有用,请在代码中提供上下文。