我最近从代码块切换到 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 在启动时需要额外信息:hPrevInstance
和 lpCmdLine
参数已弃用,并且 hInstance
和 nCmdShow
参数可以通过多种其他方式访问。话虽这么说,我不知道如何让 Microsoft 的编译器在 Windows 应用程序项目上接受 main()
,反之亦然;你也许可以通过一些搜索找到某个地方...
在引用 Visual Studio 的组件时也要小心:Visual C++ 和 Visual Basic 是非常不同的东西。
关于c++ - 运行 winapi 程序时显示的控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28650971/