2011-04-05 21 views

回答

1

要在Windows下訪問控制檯,必須將程序作爲控制檯應用程序鏈接。在Visual C++中,您可以在配置屬性/連接器/系統/子系統=控制檯下的項目設置中進行配置。

將您的應用程序鏈接爲concole應用程序而不是表示您無法打開窗口。它只是意味着a)你的過程總是有一個控制檯窗口,b)例如cmd.exe會同步執行它(=等待它完成後再繼續腳本/再次顯示提示)。

然後你就可以訪問控制檯通常的方式:使用std::coutprintf

AFAIK有沒有(好易)的方式來獲得訪問應用程序從,啓動控制檯如果應用程序鏈接作爲一個窗口應用程序。 (但是你可以分配一個新的控制檯,但我認爲這不是你想要的)。

編輯:如果你想打印一些信息到控制檯,即使輸出已被重定向,我建議你使用std::cerr打印到「錯誤輸出」。 「錯誤輸出」也默認爲控制檯,但它與「stdout」不同,並且通常不會重定向。它可以被重定向,但我認爲給用戶這個選項是一件好事,而不是通過直接打印到控制檯來解決任何重定向問題。當我需要一個「雙模式」應用程序,即一個可以使用GUI或命令提示符運行的應用程序時,我使用控制檯應用程序,並調用FreeConsole()來擺脫控制檯窗口如果通過命令行參數選擇了GUI版本(例如通過不傳遞任何參數)。如果應用程序在GUI模式下啓動(例如,通過在資源管理器中雙擊),那麼控制檯的這種方式仍會短暫彈出,但它會立即關閉,因此在GUI使用時不會使屏幕混亂。

+0

有'AttachConsole',但它具有不阻擋大多數shell的不良副作用,所以您的進程的輸出將與父級混合。 – 2011-04-05 01:16:40

+0

好吧,我改變了我的帖子,說「沒有(好,簡單)的方式來訪問控制檯......」:)順便說一句:如何得到AttachConsole的正確進程ID?如果我理解正確,就必須獲得shell的進程ID,即當前進程的父進程ID。 – 2011-04-05 01:24:23

+0

使用'ATTACH_PARENT_PROCESS'標誌,在[AttachConsole文檔](http:// msdn.microsoft.com/en-us/library/ms681952.aspx) – 2011-04-05 01:42:35

0

默認情況下,Windows控制檯應用程序已連接到控制檯stdout。如果沒有(例如,I/O被shell重定向),則可以打開特殊文件名"CONOUT$"

+0

所以我可以使用fprintf並使用CONOUT $作爲文件名? – 2011-04-05 00:35:55

+0

@Alex:是的,你可以'打開(「CONOUT $」,「W」)'然後'fprintf'。 – 2011-04-05 01:17:13