如何在MFC程序中将内容写入标准输出(stdout)?

17

MFC程序通常无法写入标准输出(stdout)。MFC在启动时会对stdout/stdin管道进行一些奇怪的操作,导致您写入的任何内容(例如使用printf("hello");)都将被丢弃到/dev/null。

有人知道如何从MFC程序成功写入标准输出(stdout)吗?

谢谢阅读。

5个回答

15

经过整整一天的尝试,使用printf()和cout打印我的MFC程序,最终我找到了一个解决方案并决定在这里发布,以帮助那些想要在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;

1
这是所有答案中唯一对我有效的一个 - 所以感谢您发布它! :) - Jesse
1
这甚至可以在Windows 10上运行!它适用于任何GUI Windows应用程序,因此您可以将其重命名为“EnablePrintfAtGUI” :) - 4LegsDrivenCat

14

如果您只是想在调试窗口中查看输出内容,您可以使用TRACE。

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

当我需要快速测试某些内容而不想使用对话框,比如 MessageBox("text") 时,我会这样做。


这并没有回答我所问的问题。 - Stephen Kellett

12

这几乎是我想要的,但你正在创建一个新的控制台。我曾经使用AttachToConsole(ATTACH_PARENT_PROCESS)却一无所获。但是解决方案是你给我的_cprintf()。因此你得到了积分。谢谢! - Stephen Kellett
@Stephen:可能您还想看一下AttachConsole函数。它与您正在尝试的有些不同。 - Nawaz
当我通过命令行调用我的EXE文件时,这会创建一个新的控制台窗口。如何将输出写入同一控制台窗口? - Lakshman Rao

10

如果当前存在控制台窗口,此操作将连接到该窗口。当应用程序不是从控制台调用时,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;
    }
}

这对我非常有效。顺便提一下,由于这是一个Windows应用程序,我使用了START /WAIT myapp.exe以使其正常工作。 - mateuscb
这在Windows 10上崩溃了。 - 4LegsDrivenCat

9

以下是我在一段时间前在线上找到的一行代码,它将标准输出附加到MFC控制台。这使得printf和cout可以向当前进程的控制台窗口写入内容。我并没有深究其工作原理,如果您需要cerr或cin版本,请自行解决。

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

1
谢谢,这个对我很有用。我需要包含 <fcntl.h>。 - opetroch
这在Windows 10上会崩溃。 - 4LegsDrivenCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接