2010-04-07 162 views
4

那么,我有一个简单的问题,至少我希望它很简单。我对win32控制台感兴趣一段时间。我们的老师告诉我们,Windows控制台仅用于DOS和实模式仿真目的。那么,我知道这是不正确的,因为DOS应用程序是由仿真程序运行,它只使用控制台来显示输出。我学到的另一件事是控制台自NT以来内置于Windows中。好。但是我找不到的是,如何编写控制台程序来使用控制台。我使用Visual C++进行编程(以及学习)。所以,我需要为使用控制台做的唯一事情是选择控制台项目。我首先想到的是,Windows决定是否在控制台中运行应用程序,或者试图在窗口模式下运行应用程序。所以我创建了win32程序并尝试了printf()。那么,我无法编译它。我知道按照定义,printf()将文本或变量输出到标准输出。我还发现stdout是输出的控制台界面。但是,我找不到实际的stdout。Windows控制台

所以,基本上我想问的是,控制台应用程序和win32应用程序的区别在哪里。当我从“控制台系列”功能获得命令时,我认为Windows开始控制台。但显然它不是,所以必须有一些实际命令窗口来创建控制台界面的代码。

而第二个问题是,当控制台创建时,Windows如何识别哪个控制台终端用于哪个应用程序?我的意思是,实际上stdout是什么?它是内存中的一个区域,还是称为某个窗口例程?谢谢。

回答

2

当您链接一个Win32应用程序时,您可以选择它是Windows还是控制台。在控制台情况下,控制台窗口将自动分配(或者,如果父进程有一个,则重用)。

但是,Windows(即GUI)应用程序也可以显示控制台窗口,只需调用AllocConsole API即可。

您测试应用程序可能无法编译许多原因,错误消息应该告诉你是否需要:

  • 包括“stdio.h中”
  • 参考的CRT(C运行时)库
  • 别的东西。

通常,如果您在Win32项目的新项目向导中选择控制台应用程序,这些事情应该是正常的,否则您需要选择正确的编译和链接选项。

+0

谢谢,但我对如何实际连接到控制台更感兴趣。什么部分代码,而不是源代码,但代码编译向Windows说我想分配控制台?谢谢。 – 2010-04-08 15:17:43

0

要回答你的第二个问题,Windows中的stdout映射到由GetStdHandle(STD_OUTPUT_HANDLE)返回的HANDLE,默认情况下它映射到CONOUT$。如果您有这种倾向,您可以致电CreateFile("CONOUT$", ...)进行访问。