Klasa koja sledi radi bas to! Napisite jednostavan programcic i ubacite ovu klasu i pokrenite program iz IDE-a sa F5. Text ce biti ispisan u Debug prozoru. Ako se program pokrene sa Ctrl+F5 nece se nista ispisivati u Debug prozoru.
Redirekcija radi cak i u Release modu ako pokrenete program sa F5.
Primer se moze dodatno modifikovati da podrzava i ispis u log file.
Ako neko ima elegantnije resenje, voleo bih da ga vidim.
Code:
#include <windows.h>
#include <io.h>
#include <stdio.h>
#include <iostream>
class OutputRedirect
{
public:
OutputRedirect()
{
/* Redirect stdout i stderr u pipe */
_pipe(pipes, 16*1024, 0);
old_stdout = _dup(_fileno(stdout));
old_stderr = _dup(_fileno(stderr));
_dup2(pipes[1], _fileno(stdout));
_dup2(pipes[1], _fileno(stderr));
CreateThread(NULL, 0, ThreadProc, this, 0, &ThreadID);
}
~OutputRedirect()
{
/* isprazniti buffere */
fflush(stdout);
fflush(stderr);
/* vrati stare vrednosti */
_dup2(old_stdout, _fileno(stdout));
_dup2(old_stdout, _fileno(stderr));
/* pocisti ostatak */
close(pipes[1]);
close(old_stdout);
close(old_stderr);
}
private:
static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
OutputRedirect* o = (OutputRedirect* )lpParameter;
char buffer[16*1024+1];
while(true)
{
int res = read(o->pipes[0], buffer, 16*1024);
if (res <= 0) break;
buffer[res] = 0;
OutputDebugString(buffer);
}
close(o->pipes[0]);
return 1;
}
int pipes[2];
int old_stdout;
int old_stderr;
DWORD ThreadID;
};
OutputRedirect redirect;
void main (void)
{
printf("\nTralalalala...");
cout << "Muuu!";
}
#include <windows.h>
#include <io.h>
#include <stdio.h>
#include <iostream>
class OutputRedirect
{
public:
OutputRedirect()
{
/* Redirect stdout i stderr u pipe */
_pipe(pipes, 16*1024, 0);
old_stdout = _dup(_fileno(stdout));
old_stderr = _dup(_fileno(stderr));
_dup2(pipes[1], _fileno(stdout));
_dup2(pipes[1], _fileno(stderr));
CreateThread(NULL, 0, ThreadProc, this, 0, &ThreadID);
}
~OutputRedirect()
{
/* isprazniti buffere */
fflush(stdout);
fflush(stderr);
/* vrati stare vrednosti */
_dup2(old_stdout, _fileno(stdout));
_dup2(old_stdout, _fileno(stderr));
/* pocisti ostatak */
close(pipes[1]);
close(old_stdout);
close(old_stderr);
}
private:
static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
OutputRedirect* o = (OutputRedirect* )lpParameter;
char buffer[16*1024+1];
while(true)
{
int res = read(o->pipes[0], buffer, 16*1024);
if (res <= 0) break;
buffer[res] = 0;
OutputDebugString(buffer);
}
close(o->pipes[0]);
return 1;
}
int pipes[2];
int old_stdout;
int old_stderr;
DWORD ThreadID;
};
OutputRedirect redirect;
void main (void)
{
printf("\nTralalalala...");
cout << "Muuu!";
}
yooyo
/././././././.com :)