stdout in eine Listbox umleiten?



  • hallo,

    es geht um folgendes: ich arbeite an einem projekt, das aus mehreren einzelnen Projekten besteht. Das Hauptprojekt ist in c++, die anderen in C geschrieben. Jetzt muss ich irgendwie die "printf´s" der "tochter-" projekte in eine Listbox des Hauptprojektes umleiten. Ich habe aber keine Ahnung wie ich das machen könnte. Vielleicht hat mir jemand nen Tipp.

    Vielen Dank im voraus.



  • hat keiner nen tipp?



  • ich habe schon zahlreiche beispiele gefunden, wie ich das für einen child-process machen kann. ich bräuchte das allerdings für den laufenden prozess.
    ich kann ja keine startupinfo nutzen wenn der prozess schon läuft.

    bräuchte dringend nen tipp. wäre sehr dankbar.



  • Wie tuts denn für nen Childprozess? Das sollte doch net so schwer zu sein das umzuschreiben.



  • Wenn ich den Childprozess starte kann ich dessen stdout mit STARTUPINFO umleiten, die ich dann mit CreateProcess übergebe. Aber mein Prozess läuft ja schon, somit kann ich das nicht über StartupInfo machen , oder?

    Vielleicht hab ich mein Problem schlecht geschildert. Ich habe in meinem Projekt 3 Libs miteingebunden, die nicht umgeschrieben werden sollen. Diese sind konsolenbasiert. Dessen printf´s sollten jetzt irgendwie in eine Listbox o.ä. "umgeleitet" werden.



  • hat sich erledigt! trotzdem danke.



  • Wie?



  • dEUs schrieb:

    Wie?

    • Named Pipe erzeugen
    • Mit freopen stdout auf die Pipe umbiegen
    • Mit setvbuf das Buffering ausschalten

    Ich hab's nun jetzt erst gesehen, sonst hätte ich auch schon früher was dazu gesagt.



  • habe folgenden Beitrag in einem Forum gefunden.

    Accepted Answer from _nn_
    Date: 09/19/2003 07:53AM PDT
    Accepted Answer

    FWIW, I managed to get something running following way : I build a dialog based app with a couple controls, some dedicated to generate printf() calls (an edit and a button), and a simple listbox for output.

    Following needed to be declared somewhere :

    // a name for the pipe, make it dependant of the app name seems a good idea
    #define PIPENAME "\\\.\\pipe\\myapp_loopback"
    // a handle for the readin end of the pipe
    HANDLE rPipe;

    In the OnInitDialog() I pasted this : (warning : no error-checking made, you'll have to deal with it)

    // Create the pipe, we only need inbound
    rPipe = CreateNamedPipe(PIPENAME,
    PIPE_ACCESS_INBOUND,
    0,
    1,
    2048,
    2048,
    500,
    NULL);

    // We can already connect the reading end of the pipe and assign it to stdout
    freopen(PIPENAME, "w", stdout);

    // This call is necessary and will FAIL. This is NORMAL. GetLastError() should
    // return ERROR_PIPE_CONNECTED
    ConnectNamedPipe(rPipe, NULL);

    // The reason for the above order (freopen, then ConnectNamedPipe) is simple
    // This way, ConnectNamedPipe won't block waiting for a connection

    // Set up a timer
    SetTimer(42, 1000, NULL); // For "connaisseurs" 😉

    Finally, the handler :

    void CBlahDlg::OnTimer(UINT nIDEvent)
    {
    if (nIDEvent == 42) {
    DWORD bytesRead;
    char buf[256];
    fflush(stdout); // necessary, or you could wait long before seeing lines
    do {
    bytesRead = 0;
    // look first in the pipe to prevent ReadFile from blocking
    if (PeekNamedPipe(rPipe, buf, sizeof(buf), &bytesRead, NULL, NULL)
    && bytesRead) {
    ReadFile(rPipe, buf, bytesRead, &bytesRead, NULL);
    buf[bytesRead] = 0;
    m_List.AddString(buf);
    }
    } while (bytesRead);
    return;
    }

    CDialog::OnTimer(nIDEvent);
    }

    Some issues left : how to deal with partial output, line-feeds (don't look good in a listbox), etc, but I guess you can figure that out.

    Hope this helps.

    Hier die URL: http://www.experts-exchange.com/Programming/Programming_Languages/MFC/Q_20743173.html#9393890

    Bloß habe ich das in einem Thread gemacht und nicht mit einem Timer.


Log in to reply