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

Console showing when running winapi program

我最近从代码块切换到 VC++。当我用 winapi 在代码块中制作一个基本的 window 程序时,我会在后台有一个控制台 window,显示诸如 std::cout 之类的东西。现在,当我在 Visual C++ 中 运行 相同的程序时,它只显示 winapi window,而不显示控制台。因此,如果我将其设置为 cout << "click" 每次单击时,它都不会显示,因为没有控制台。

有人知道如何解决这个问题吗?不知道是需要插线还是改设置。

更新:

我设置了以下代码以将控制台连接到我的 window 并让它注册 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 未声明。我真的不知道第一个参数应该是什么,即使在阅读它是 "A pointer to the file pointer to be provided by the call." 之后也是如此。我应该在这里放什么?

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

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

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

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

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

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

我最近 运行 遇到了类似的问题。这个解决方案对我有用:

FILE* conin = stdin;
FILE* conout = stdout;
FILE* conerr = stderr;
AllocConsole();
AttachConsole(GetCurrentProcessId());
freopen_s(&conin, "CONIN$", "r", stdin);
freopen_s(&conout, "CONOUT$", "w", stdout);
freopen_s(&conerr, "CONOUT$", "w", stderr);
SetConsoleTitle(L"appconsole");