【问题标题】:Windows consoleWindows 控制台
【发布时间】:2010-04-07 17:29:05
【问题描述】:

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

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

第二个问题是,在创建控制台时,windows如何识别哪个控制台终端用于哪个应用程序?我的意思是,什么是标准输出?它是内存中的一个区域,还是一些被调用的 Windows 例程?谢谢。

【问题讨论】:

    标签: windows console stdout


    【解决方案1】:

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

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

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

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

    通常,如果您在新项目向导中为 Win32 项目选择控制台应用程序,这些东西应该可以正常工作,否则您需要选择正确的编译和链接选项。

    【讨论】:

    • 谢谢,但我更感兴趣的是实际上如何链接到控制台。代码的哪一部分(不是源代码,而是代码编译后的代码)对 Windows 说我要分配控制台?谢谢。
    【解决方案2】:

    为了回答您的第二个问题,Windows 中的stdout 映射到GetStdHandle(STD_OUTPUT_HANDLE) 返回的HANDLE,默认情况下映射到CONOUT$。如果您愿意,可以拨打CreateFile("CONOUT$", ...) 访问它。

    【讨论】:

      猜你喜欢
      • 2011-08-15
      • 2011-03-31
      • 2016-12-13
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多