2011-04-05 17 views

回答

1

要在Windows下访问控制台,必须将程序作为控制台应用程序链接。在Visual C++中,您可以在配置属性/连接器/系统/子系统=控制台下的项目设置中进行配置。

将您的应用程序链接为concole应用程序而不是表示您无法打开窗口。它只是意味着a)你的过程总是有一个控制台窗口,b)例如cmd.exe会同步执行它(=等待它完成后再继续脚本/再次显示提示)。

然后你就可以访问控制台通常的方式:使用std::coutprintf

AFAIK有没有(好易)的方式来获得访问应用程序从,启动控制台如果应用程序链接作为一个窗口应用程序。 (但是你可以分配一个新的控制台,但我认为这不是你想要的)。

编辑:如果你想打印一些信息到控制台,即使输出已被重定向,我建议你使用std::cerr打印到“错误输出”。 “错误输出”也默认为控制台,但它与“stdout”不同,并且通常不会重定向。它可以被重定向,但我认为给用户这个选项是一件好事,而不是通过直接打印到控制台来解决任何重定向问题。当我需要一个“双模式”应用程序,即一个可以使用GUI或命令提示符运行的应用程序时,我使用控制台应用程序,并调用FreeConsole()来摆脱控制台窗口如果通过命令行参数选择了GUI版本(例如通过不传递任何参数)。如果应用程序在GUI模式下启动(例如,通过在资源管理器中双击),那么控制台的这种方式仍会短暂弹出,但它会立即关闭,因此在GUI使用时不会使屏幕混乱。

+0

有'AttachConsole',但它具有不阻挡大多数shell的不良副作用,所以您的进程的输出将与父级混合。 – 2011-04-05 01:16:40

+0

好吧,我改变了我的帖子,说“没有(好,简单)的方式来访问控制台......”:)顺便说一句:如何得到AttachConsole的正确进程ID?如果我理解正确,就必须获得shell的进程ID,即当前进程的父进程ID。 – 2011-04-05 01:24:23

+0

使用'ATTACH_PARENT_PROCESS'标志,在[AttachConsole文档](http:// msdn.microsoft.com/en-us/library/ms681952.aspx) – 2011-04-05 01:42:35

0

默认情况下,Windows控制台应用程序已连接到控制台stdout。如果没有(例如,I/O被shell重定向),则可以打开特殊文件名"CONOUT$"

+0

所以我可以使用fprintf并使用CONOUT $作为文件名? – 2011-04-05 00:35:55

+0

@Alex:是的,你可以'打开(“CONOUT $”,“W”)'然后'fprintf'。 – 2011-04-05 01:17:13