无法获得AllocConsole的STD句柄

时间:2017-08-22 16:28:23

标签: c++ windows-console

我一直试图将输出句柄输出到我的控制台,但它似乎无法正常工作。我得到它来设置我的文字的颜色,但它没有改变。

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut, 0x0A)

我试图调试它,我认为我的处理方式并不正确。有没有其他方法可以做到这一点,它不起作用是正常的吗?任何修复?

谢谢!

编辑:让我澄清一下,我试图获得的句柄无效。我不知道如何修复它。我想我会开始寻找替代方案;也许我的代码有问题。

4 个答案:

答案 0 :(得分:3)

标准处理程序在进程创建期间初始化,如果您调用botuser新控制台很晚才创建。 AllocConsole 可以更改标准句柄,但启动代码使用它们为时已晚,例如C运行时库初始化。

在这种情况下,最好的做法是AllocConsole,无论您是否连接到父进程的控制台,它都会获得一个控制台句柄,操作系统为您创建一个,因为您的PE头是CreateFileW(L"CONOUT$", ...)或者你打电话给/SUBSYSTEM:CONSOLE。即使重定向标准句柄,它也会获得控制台句柄。

如果您认为可以致电AllocConsole,则应确保首先关闭FreeConsole返回的所有句柄。在控制台保持活动直到进程退出的一般情况下,您可以让OS在进程清理期间为您关闭句柄。

答案 1 :(得分:1)

由于您指定hOutINVALID_HANDLE_VALUE(或可能为NULL),因此请尝试拨打GetLastError以找出原因。您可能没有建立控制台会话。

这是一个win32控制台应用程序还是一个Windows SubSystem应用程序(它有WinMain吗?)

您可以在AttachConsole(ATTACH_PARENT_PROCESS)之前尝试AllocConsole而不是GetStdHandle

在任何一种情况下,AllocConsoleAttachConsole都会返回BOOL,如果FALSE,则表示您可以致电GetLastError查找原因。

在上面列出的行之前,请确保您没有呼叫hOut = GetStdHandle(STD_OUTPUT_HANDLE)后跟CloseHandle(hOut)。与AllocConsoleFreeConsole不同,关闭std句柄并不是一个好主意。

最后,试试:

#define _WIN32_WINNT 0x0501

之前

#include <windows.h>

答案 2 :(得分:0)

对于这么小的事情这么多的戏剧......顺便说一下,@ Ben的回答是正确的答案实际上是正确的。

对于您的问题,请执行以下操作:

freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);

这将允许您获取任何控制台的句柄。确保在AllocConsole();

之前放置它

享受?!

答案 3 :(得分:-1)

好的,我找到了答案。看起来像一个简单的编辑可以解决它

#define setcsattr(clr) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), clr)