C++ 重定向子进程的stdin不适用于Windows/Qt

C++ 重定向子进程的stdin不适用于Windows/Qt,c++,windows,qt,C++,Windows,Qt,我们有一个运行在Windows8.1上的Qt(Qt5.7)应用程序,我们希望从另一个Qt应用程序启动该应用程序。父进程应该通过读取其stdout和stderr并写入其stdin来与子进程通信 子进程是一个Windows GUI应用程序。在子进程中,我们有一个带有以下初始化代码的类consolerereader(我们遵循找到的信息): 在父进程中,我们执行以下操作: QProcess process; process.setProcessChannelMode(QProcess::MergedC

我们有一个运行在Windows8.1上的Qt(Qt5.7)应用程序,我们希望从另一个Qt应用程序启动该应用程序。父进程应该通过读取其
stdout
stderr
并写入其
stdin
来与子进程通信

子进程是一个Windows GUI应用程序。在子进程中,我们有一个带有以下初始化代码的类
consolerereader
(我们遵循找到的信息):

在父进程中,我们执行以下操作:

QProcess process;

process.setProcessChannelMode(QProcess::MergedChannels);
process.start(executablePath, arguments);
process.waitForStarted();
然后,我们使用

QTextStream inputStream(&process);
... inputStream.readLine();
const QByteArray bytesToWrite = ...;
process.write(bytesToWrite);
并使用写入子进程的
stdin

QTextStream inputStream(&process);
... inputStream.readLine();
const QByteArray bytesToWrite = ...;
process.write(bytesToWrite);
从子流程读取数据是有效的。 另一方面,当父进程尝试写入时,在父进程上写入成功,但子进程未收到任何数据

请注意,同样的解决方案也适用于Linux。在Linux上,
ConsoleReader
中的初始化代码是

QSharedPointer<QSocketNotifier> mNotifier;

mNotifier.reset(new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read));
connect(mNotifier.data(), &QSocketNotifier::activated,
this, &ConsoleReader::onData);
QSharedPointer mNotifier;
mNotifier.reset(新的QSocketNotifier(标准文件号,QSocketNotifier::Read));
连接(mNotifier.data(),&QSocketNotifier::已激活,
这是&consolerereader::onData);
代码的其余部分是相同的


那么,在Windows上尝试写入子进程的
stdin
时会出现什么问题呢?

您可以放弃对
AttachConsole
freopen
的调用,它们正在默默地失败,并且无论如何都不会执行您想要的操作-
CON
设备代表控制台窗口,而不是标准的输入/输出。对于标准输入,您确定父进程正在发送所需的任何行尾字符readLine()吗?谢谢您的提示。我把
附件控制台
freopen
放在外面了,现在它似乎可以工作了。不知何故,我发现我链接的页面中的信息有点误导。我现在必须做一些彻底的测试。那次讨论实际上是关于让GUI程序创建和使用控制台。您正在尝试读取和写入父级提供的标准句柄,这是完全不同的情况。您可以放弃对
AttachConsole
freopen
的调用,它们会自动失败,并且无论如何都不会做您想做的事情-
CON
设备代表控制台窗口,而不是标准输入/输出。对于标准输入,您确定父进程正在发送所需的任何行尾字符readLine()吗?谢谢您的提示。我把
附件控制台
freopen
放在外面了,现在它似乎可以工作了。不知何故,我发现我链接的页面中的信息有点误导。我现在必须做一些彻底的测试。那次讨论实际上是关于让GUI程序创建和使用控制台。您正在尝试读取和写入父级提供的标准句柄,这完全是另一种情况。