如何从 Windows 应用程序输出到标准输入?
Posted
技术标签:
【中文标题】如何从 Windows 应用程序输出到标准输入?【英文标题】:How to output to stdin from a Windows application? 【发布时间】:2018-10-24 18:32:47 【问题描述】:这是我的代码的 sn-p:
AttachConsole(-1);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
freopen("CONIN$", "r", stdin); //this doesn't seem to do anything
int n = 0;
cin >> n;
cout << n + 1;
FreeConsole();
WNDCLASSA MainWindow = 0 ;
MainWindow.hbrBackground = (HBRUSH) COLOR_WINDOW;
MainWindow.hCursor = LoadCursor(NULL, IDC_ARROW);
MainWindow.hInstance = hInst;
//here the window gets created etc.
显然这里控制台的使用是基本的,但这应该可以解决这个问题。问题是cin
或scanf
之类的功能不起作用。 cout
、cerr
、clog
、printf
工作正常,但输入函数没有做任何事情。如何使stdin
工作(最好使用cin
)?
【问题讨论】:
你在freopen()
流媒体之后尝试过std::cin.clear()
吗?
你为什么不用Unicode
@J.在freopen("CONIN$", "r", stdin)
之后添加cin.clear()
不起作用。
@stackptr 我不需要 Unicode,我不明白为什么这与这个问题有关
您可以尝试与freopen()
文章中描述的freopen()
不同的方法。
【参考方案1】:
您的/SUBSYSTEM:WINDOWS
程序将在启动时与控制台分离,命令处理器cmd.exe
再次等待用户输入。所以stdin
在你的程序可以尝试任何输入操作之前已经被使用了。
其实,
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <iostream>
int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
AttachConsole(-1);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
freopen("CONIN$", "r", stdin);
std::cout.clear();
std::cin.clear();
std::cout << "Hello!\n";
int i;
std::cin >> i;
std::cout << i << '\n';
std::cin.get();
std::cin.get();
使用start /wait foobar.exe
从命令提示符运行时按预期工作。 (foobar.exe
必须构建为 x64 才能在 x64 Windows 上以这种方式工作。尝试使用 x86 可执行文件会给出有趣的错误消息。)
有关该主题的讨论,请参阅 How do I write a program that can be run either as a console or a GUI application?。
【讨论】:
它说_O_TEXT
未定义
_O_TEXT
定义在<fcntl.h>
我从 WinMain 调用它并检查返回值是否为 false。如果是,则显示一个 Windows 消息框,否则不显示。当没有控制台启动时,它会显示(显然),但是当使用控制台启动时,它不会显示,但标准输入和标准输出都不起作用。
你检查你的AttachConsole(-1);
的返回值吗?到底什么是父进程?
是的,我查过了,只有在实际有调用控制台时才返回TRUE
以上是关于如何从 Windows 应用程序输出到标准输入?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 上的 CreateProcess() 中不继承标准输入、标准输出和标准错误