ReadFile für ne pipe bis zu bestimmten zeichen



  • hiho

    kurze erklärung was ich will.

    ich errichte eine Pipe zwischen einem DOS programm und meinem windoofs proggi via createprozess stdin und stdout auf die Pipehandle verbogen...
    läuft alles wunderbar bekomme alles von dem dos proggi rüber.

    nu meine frage. kann ich das buffer nur zu einem bestimmten zeichen auslesen? sprich ich will erstmal nur alles bis zum zeilenumbruch haben der rest kommt beim nächsten auslesen dran ...

    hoffe ihr habt mich verstanden 😑



  • ähm ich hab das jetzt erstmal so gelöst ->

    DWORD CRfcDlg::ReadAndHandleOutput(HANDLE hPipeRead,CString& out)
    {
        char lpBuffer[1024];
        lpBuffer[0]='\0';
        DWORD err;
    
        DWORD nBytesRead;
        nBytesRead = GetFileSize(hPipeRead,NULL);
        //schau ob daten im stdout buffer des prozesses liegen
    
        if(nBytesRead==0xFFFFFFFF||nBytesRead==0x00000000)
        {   
            //wenn keine daten vorhanden sind oder ein fehler aufgetreeten ist
            //wird der prozess 'angepingt' 
            //einfach ein datenpacket gesendet und überprüft obs ankommt oder 
            //die pipe zusammen gebrochen ist
            DWORD nBytesWrote;
            char read_buff[]="ping";
            WriteFile(list.getcurrentknoten()->hOutWrite,read_buff,nBytesRead,&nBytesWrote,NULL);
            return GetLastError();
            //gibt den fehlercode zurück
    
        }
        else
        {
            PeekNamedPipe(hPipeRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL,NULL);
            //wenn daten gefunden wurden werden diese ausgelesen 
            //und noch nicht aus dem buffer gelöscht
            err = GetLastError();
            if(err==ERROR_NO_DATA)
            {
                //wenn die pipe zusammen gebrochen ist wird ERROR_NO_DATA zurückgegeben
                delFromList(list.getcurrentknoten()->id);
                return err;
            }
            lpBuffer[nBytesRead]='\0';
            out=lpBuffer;
    
            //sucht den zeilenumbruch. somit wird eine zeilenweises auslesen garantiert
            if(int tI=out.FindOneOf("\r\n"))
            {
                ReadFile(hPipeRead,lpBuffer,tI+2,&nBytesRead,NULL);
                //liest und löscht die daten aus dem buffer bis zu dem gefundenen zeilenumbruch
            }
            //wenn daten gelesen wurden werden diese in die out var. geschrieben 
            //und die funktion mit NO_ERROR beendet
            lpBuffer[nBytesRead]='\0';
            out=lpBuffer;
        }
        //delete lpBuffer;
        return NO_ERROR;
    }
    

    kann mir das vieleicht einer etwas optimieren ?

    wenn ich nu mehrere prozesse starte kanns vorkommen das er manches doppelt ausliest ?!? 😕 warum auch imma


Log in to reply