[英]Cannot get STD handle to AllocConsole
我一直在尝试获取控制台的输出句柄,但它似乎不起作用。 我用它来设置文本的颜色,但它没有改变。
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut, 0x0A)
我试图调试它,我认为我的句柄不对。 有没有其他方法可以做到这一点,它不起作用是否正常? 任何修复?
谢谢!
编辑:让我澄清一下,我试图获得的句柄无效。 我不知道如何解决它。 我想我会开始寻找替代品; 也许我的代码有问题。
标准处理程序在进程创建期间初始化,如果您调用AllocConsole
,新控制台将在很晚之后创建。 AllocConsole
可以更改标准句柄,但是对于启动代码(例如 C 运行时库初始化)使用它们来说为时已晚。
在这种情况下,最好的做法是CreateFileW(L"CONOUT$", ...)
,无论您是否连接到父进程的控制台,它都会获得一个控制台句柄,操作系统会为您创建一个,因为您的 PE 标头是/SUBSYSTEM:CONSOLE
,或者您调用了AllocConsole
。 即使重定向标准句柄,它也会获得控制台句柄。
如果您认为可以调用FreeConsole
,则应确保首先关闭CreateFile
返回的所有句柄。 在控制台保持活动状态直到进程退出的一般情况下,您可以让操作系统在进程清理期间为您关闭句柄。
由于您指定hOut
为INVALID_HANDLE_VALUE
(或可能为NULL
),请尝试调用GetLastError
以找出原因。 您可能没有建立控制台会话。
这是一个 win32 控制台应用程序还是一个 Windows 子系统应用程序(它有WinMain
吗?)
您可以在GetStdHandle
之前尝试AttachConsole(ATTACH_PARENT_PROCESS)
而不是AllocConsole
。
在任何一种情况下, AllocConsole
和AttachConsole
返回一个BOOL
,如果为FALSE
,则表示您可以调用GetLastError
来找出原因。
确保您没有在上面列出的行之前调用hOut = GetStdHandle(STD_OUTPUT_HANDLE)
和CloseHandle(hOut)
。 与AllocConsole
和FreeConsole
不同,关闭 std 句柄不是一个好主意。
最后,尝试:
#define _WIN32_WINNT 0x0501
在#include <windows.h>
之前
这么小的事情有这么多的戏剧性......顺便说一下@Ben的答案是正确的答案实际上是正确的。
对于您的问题,只需执行以下操作:
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
这将允许您获得您拥有的任何控制台的句柄。 确保你把它放在 AllocConsole(); 之后。
享受?!
好的,所以我找到了答案。 似乎一个简单的编辑可以修复它
#define setcsattr(clr) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), clr)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.