[英]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.