簡體   English   中英

無法獲取 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返回的所有句柄。 在控制台保持活動狀態直到進程退出的一般情況下,您可以讓操作系統在進程清理期間為您關閉句柄。

由於您指定hOutINVALID_HANDLE_VALUE (或可能為NULL ),請嘗試調用GetLastError以找出原因。 您可能沒有建立控制台會話。

這是一個 win32 控制台應用程序還是一個 Windows 子系統應用程序(它有WinMain嗎?)

您可以在GetStdHandle之前嘗試AttachConsole(ATTACH_PARENT_PROCESS)而不是AllocConsole

在任何一種情況下, AllocConsoleAttachConsole返回一個BOOL ,如果為FALSE ,則表示您可以調用GetLastError來找出原因。

確保您沒有在上面列出的行之前調用hOut = GetStdHandle(STD_OUTPUT_HANDLE)CloseHandle(hOut) AllocConsoleFreeConsole不同,關閉 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM