[ yooyo @ 17.09.2004. 19:13 ] @
Ovo me je oduvek zanimalo kako da izvedem.. Malo sam kopao po net-u i naisao na interesantnu ideju da stdxxx presumerim u pipe, a zatim da iz pipe-a citam i upisujem u Debug window. Zbog toga sam napisao resenje sa koriscenjem thread-a. 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!"; } yooyo /././././././.com :) |