2011-02-23 63 views
8

MFC程序無法正常寫入標準輸出。在啓動過程中,MFC使用stdout/stdin管道來做一些奇怪的事情,並且你寫的任何東西(比如做一個printf(「hello」);)就會進入/ dev/null。如何從MFC程序寫入stdout?

有誰知道如何成功地從MFC程序寫入標準輸出?

感謝您的閱讀。

回答

7

使用AllocConsole函數來創建寫入控制檯。以下文章解釋瞭如何使用它來打印到控制檯。

Creating a console for your MFC app's debug output

不要忘記FreeConsole一旦你用它做。

+0

這是我想幾乎什麼,而是你正在創建一個新的安慰。我正在使用AttachToConsole(ATTACH_PARENT_PROCESS)並且什麼也沒有。但是解決方案是你給我的_cprintf()。因此你可以得到積分。謝謝! – 2011-02-23 17:40:56

+0

@Stephen:可能你也想看到[AttachConsole](http://msdn.microsoft.com/en-us/library/ms681952(v = vs.85).aspx)函數。這與你正在試驗的有點不同。 – Nawaz 2011-02-23 17:46:29

+0

[我如何寫出一個好的答案?](http://stackoverflow.com/help/how-to-answer)。 – IInspectable 2015-07-25 19:51:41

7

這是我在網上找到的一種單線程,它將MFC連接到控制檯的標準輸出。這允許printf和cout寫入當前進程的控制檯窗口。我從來沒有研究過它是如何工作的,所以如果你需要一個cerr或cin版本,那麼你就是自己的。

AllocConsole(); 
*stdout = *_tfdopen(_open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), _O_APPEND), _T("a")); 
+0

謝謝,這對我有用。我需要包括。 – opetroch 2017-02-14 18:29:36

7

這將附加到調用控制檯窗口,如果有的話。當應用程序未從控制檯調用時,GotConsoleAttach將爲FALSE

GotConsoleAttach = FALSE;  
if (AttachConsole(ATTACH_PARENT_PROCESS)) 
{ 
    int osfh = _open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), 8); 
    if ((HANDLE)osfh != INVALID_HANDLE_VALUE) 
    { 
     *stdout = *_tfdopen(osfh, _T("a")); 
     GotConsoleAttach = TRUE; 
    } 
} 
+0

這對我很好。在附註中,由於這是一個Windows應用程序,因此我使用了「START/WAIT myapp.exe」以使其正常工作。 – mateuscb 2014-12-03 23:12:06

7

如果您只是尋找輸出到調試窗口,您可以使用TRACE。

TRACE("This is a debug string of text in MFC"); 

我這樣做,當我快速測試的東西,不想使用對話框,如MessageBox(「文本」)。

+0

這不回答我問的問題。 – 2014-12-11 14:03:22

0

花費一整天的時間試圖讓我的MFC程序中使用printf()和COUT我終於找到了解決方案,打印,並決定張貼在這裏,以幫助誰願意在MFC打印後...

void EnablePrintfAtMFC() 
{ 
    if (AttachConsole(ATTACH_PARENT_PROCESS)) 
    { 
     FILE* pCout; 
     freopen_s(&pCout, "CONOUT$", "w", stdout); 
     std::cout.clear(); 
     std::wcout.clear(); 
    } 
} 

只需撥打上述功能在某些地方你的程序的,在那之後,你將能夠使用printf()和COUT ...

EnablePrintfAtMFC(); 
printf("Hello world!\n"); 
std::cout << "It works!" << endl;