将stdout重定向到编辑控件(Win32)

时间:2009-11-07 13:11:04

标签: winapi redirect

我有一个简单的Win32 GUI应用程序,它在主窗口中有一个编辑控件。如果我写:

printf("Hello world!\n");

我希望文本显示在该控件中而不是控制台中。怎么样?

更新:应用程序只是带编辑控件的简单窗口,我可以在显示或不显示控制台(gcc -mwindows)的情况下编译它。有时我会调用一个外部函数,这可能是printf()的东西 - 我想抓住那些东西并在编辑控件中显示它。到目前为止,SetStdHandle()似乎最接近我试图实现的目标,但我无法让它工作,但是......


更新2: 请问,有人可以告诉我为什么这不起作用以及如何解决它?

HANDLE hRead, hWrite;
CreatePipe(&hRead, &hWrite, NULL, 0);

SetStdHandle(STD_OUTPUT_HANDLE, hWrite);

printf("Hello world!\n");

CloseHandle(hWrite); // Why is this needed?

DWORD dwRead;
BOOL bSuccess;
CHAR chBuf[4096];
bSuccess = ReadFile(hRead, chBuf, 4096, &dwRead, NULL); // This reads nothing :(

此外,它仍然会向控制台打印“Hello world”,我预计它不会......?

3 个答案:

答案 0 :(得分:5)

查看API调用SetStdHandle。将stdout重定向到您的流后,从中读取并将文本发送到编辑控件。

[编辑]

看一下使用dup2。以下代码似乎有效。

int fds[2];
_pipe (fds, 1024, O_TEXT);
_dup2 (fds[1], 1);      // 1 is stdout
printf ("Test\r\n");
char buffer[100];
_flushall();            // Need to flush the pipe
int len = _read (fds[0], buffer, 100);
buffer[len] = 0;        // Buffer now contains "Test\r\n"

答案 1 :(得分:1)

您可以在Windows中通过在创建进程时重定向stdout来执行此操作。您可以通过设置标志并设置传递给STARTUPINFOCreateProcess结构中的某些句柄来实现此目的。有关如何进行此设置的详细信息,请参阅MSDN上的this example

完成设置后,可以使用ReadFile从控制台进程的重定向标准输出读取,然后将其发送到编辑控件。

答案 2 :(得分:-3)

编写一个内部__printf函数可以输出文本进行编辑控件,然后用它替换所有printf函数。