Как мне написать в стандартный вывод из программы MFC? - PullRequest
10 голосов
/ 23 февраля 2011

Программы MFC не могут нормально записывать на стандартный вывод.MFC делает что-то странное с каналами stdout / stdin во время запуска, и все, что вы пишете (например, делает printf ("привет");), просто переходит в /dev/null.

Кто-нибудь знает, как успешно писатьвыйти из программы MFC?

Спасибо за чтение.

Ответы [ 5 ]

10 голосов
/ 23 февраля 2011

Используйте функцию AllocConsole , чтобы создать консоль для записи. В следующей статье объясняется, как использовать его для печати на консоли.

Создание консоли для отладочного вывода вашего приложения MFC

Не забудьте FreeConsole , как только вы закончите.

8 голосов
/ 08 октября 2012

Будет прикреплено к окну вызывающей консоли, если оно есть. 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;
    }
}
8 голосов
/ 15 августа 2011

Вот одна строка, которую я недавно нашел в сети и которая подключает стандартный вывод к консоли в MFC.Это позволяет printf и cout записывать в консольное окно текущего процесса.Я никогда не изучал, как это работает, поэтому, если вам нужна версия cerr или cin, вы по своему усмотрению.

AllocConsole();
*stdout = *_tfdopen(_open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), _O_APPEND), _T("a"));
7 голосов
/ 25 сентября 2013

Если вы просто ищете вывод в окно отладки, вы можете использовать TRACE.

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

Я делаю это, когда быстро что-то тестирую и не хочу использовать диалоговые окна, такие как MessageBox("текст").

2 голосов
/ 11 августа 2017

Потратив целый день, пытаясь заставить мою программу 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;
...