Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Redirekcija stdout, stderr, cout i cerr u Debug window (MSVC)

[es] :: C/C++ programiranje :: Redirekcija stdout, stderr, cout i cerr u Debug window (MSVC)

[ Pregleda: 1775 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

yooyo

Član broj: 4891
Poruke: 1101
*.nat-pool.bgd.sbb.co.yu



Profil

icon Redirekcija stdout, stderr, cout i cerr u Debug window (MSVC)17.09.2004. u 19:13 - pre 238 meseci
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 :)
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Re: Redirekcija stdout, stderr, cout i cerr u Debug window (MSVC)17.09.2004. u 21:05 - pre 238 meseci
Odlicna klasa... vrlo korisna :)
 
Odgovor na temu

srdjandakic

Član broj: 11297
Poruke: 430
*.sbb.co.yu



+14 Profil

icon Re: Redirekcija stdout, stderr, cout i cerr u Debug window (MSVC)17.09.2004. u 21:18 - pre 238 meseci
Interesantno ...

BTW, pisem program koji ima GUI u Delphiju, ali koristi konzolnu aplikaciju pisanu u MSVC.

Na isti nacin sam capturovao konzolni izlaz. Pre startovanja konzolne aplikacije koristim CreatePipe i DuplicateHandle, a potom kreiram thread u kome radim ReadFile.

Bile su mi potrebne jos neke informacije osim std izlaza, pa je ostvarena komunikacija uz pomoc kontrolnih prozora u GUI i konzolnoj. Ako startujes iz komandne linije ili VC debuggera ispisuje printf("%d done"), ali ako startujes iz GUI-ja updateuje se progress bar.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Redirekcija stdout, stderr, cout i cerr u Debug window (MSVC)

[ Pregleda: 1775 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.