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

时间:2015-02-21 20:32:15

标签: c++ winapi

我最近从代码块切换到VC ++。当我使用winapi在codeblocks中创建一个基本的窗口程序时,我会在后台有一个控制台窗口,显示诸如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是未声明的。我真的不知道第一个参数应该是什么,即使在读取它是“指向由调用提供的文件指针的指针”之后。我该放什么?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

答案 1 :(得分:0)

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

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");