无法获取 AllocConsole 的 STD 句柄
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
不同,关闭标准手柄不是一个好主意。
最后,尝试:
#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)
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 无法获取 AllocConsole 的 STD 句柄
- 从本机句柄创建std ::线程
- 为什么这个非常简单的返回 std::move(线程句柄)失败
- 用新的控制台窗口创建进程,但覆盖一些std i/o句柄