c++ - 运行 winapi 程序时显示的控制台

标签 c++ winapi

我最近从代码块切换到 VC++。当我使用 winapi 在代码块中制作基本窗口程序时,我会在后台有一个控制台窗口,显示 std::cout 等内容。现在,当我在 Visual C++ 中运行相同的程序时,它只显示 winapi 窗口,而不显示控制台。因此,如果我将其设置为 cout <<“单击”,则每次单击时它都不会显示,因为没有控制台。

有人知道如何解决这个问题吗?我不知道是否需要插入一行或更改设置。

更新:

我已经设置了以下代码,将控制台附加到我的窗口并让它注册 cout、cin 和 err。

AllocConsole();
AttachConsole(GetCurrentProcessId());
freopen_s(&conin, "conin$", "r", stdin);
freopen_s(&conout, "conout$", "w", stdout);
freopen_s(&conout, "conout$", "w", stderr);

虽然当我构建它时,我收到一条错误,指出 &conin、&conout 未声明。我真的不知道第一个参数应该是什么,即使在阅读它之后它是“指向调用提供的文件指针的指针。”。我应该在这里放什么?

最佳答案

链接 Windows 可执行文件时,您可以选择确定 PE header 中的标志,该标志确定可执行文件是代表控制台应用程序还是 Windows 应用程序>。该标志的唯一作用是确定 Windows 在您启动程序时是否为您的程序创建一个控制台(也可能将标准句柄连接到它;我不确定,但是 AllocConsole() 文档暗示如此)。典型的 Windows 程序不使用控制台,因此这对它们来说是一件好事。

我不知道 Code::Blocks 默认提供哪些项目模板,但 Visual Studio 提供控制台应用程序和 Windows 应用程序模板,您选择的模板决定了此链接器标志的设置。您应该能够使用任一 IDE 在其项目首选项页面中更改标志。 (不同的项目模板主要为您提供不同的起始代码和设置,但它们绝不是您可以编写的内容的绝对衡量标准。)

如果您在没有创建项目的情况下使用了 Code::Blocks(不知何故;我不使用 Code::Blocks),那么重要的是要知道 MinGW(很可能是 Code::Blocks 附带的编译器)会生成默认情况下控制台应用程序。

正如乔纳森·波特(Jonathan Potter)上面的评论所解释的那样,该控制台没有什么特别之处;您可以创建控制台并在程序中即时使用它们。有关详细信息,请参阅 MSDN。但是,如果您这样做,请参阅下面 Remy Lebeau 的评论,因为您需要告诉 stdio(以及 iostream,在 C++ 的情况下)。同样,控制台程序可以自由地创建它所选择的常规窗口。

最后一个陷阱是,Microsoft 的编译器实际上区分了控制台应用程序的 main) 和 Windows 应用程序的 WinMain()。引入 WinMain() 是因为 16 位 Windows 在启动时需要额外信息:hPrevInstancelpCmdLine 参数已弃用,并且 hInstancenCmdShow 参数可以通过多种其他方式访问。话虽这么说,我不知道如何让 Microsoft 的编译器在 Windows 应用程序项目上接受 main() ,反之亦然;你也许可以通过一些搜索找到某个地方...

在引用 Visual Studio 的组件时也要小心:Visual C++ 和 Visual Basic 是非常不同的东西。

关于c++ - 运行 winapi 程序时显示的控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28650971/

相关文章:

c++ - 浏览文件夹对话框窗口句柄 C++

c++ - 如何从类中初始化数组并将值设置为第一个元素?

c++ - 如何覆盖二传手?

c++ - 在对象构造函数中初始化boost线程?

c++ - 玩弄 for arguments

winapi - 回调中的Win32 API向量问题

windows - 如何为通过 CreateWindow 创建的窗口指定字体?

c - 如何将 Unicode 路径转换为 ​​C 字符串?

c++ - COM 端口上的 Win32 重叠读取文件返回 ERROR_OPERATION_ABORTED

c++ - 快速而肮脏的运营商!=