problem(e) mit pipe(s) + umleitung der ausgabe ... readfile list nicht ... irgend was vergessen??



  • hi unten mal ein stück code
    ich will eigentlich nur die cmd öffnen und erstmal die ausgabe von der in meine winapi anwendung umleiten ... die andere richtung müsste dann ja analog laufen ...

    aber irgend was scheine ich noch zu vergssen?! jedenfalls kommt bei readfile nix raus ... er zeigt gleich "ende" an

    achja den passenden MSDN artikel kenne ich ...
    aber ehrlichgesagt bringt mir da

    http://win32asm.cjb.net/

    und da das asm-tutorial zu pipes mehr
    aber irgend was scheine ich zu vergessen?! ...

    bitte daher um hilfe 😉

    danke + cu

    error

    edit: habs gefunden ... arg!!! natürlich muss das False in creatprocess auf true ... man soas dummes!!... voll übersehen ...

    danke(im code auch geändert!!

    PAINTSTRUCT ps;
    	HDC hdc;
    
      char buffer[1024];
      DWORD bytesRead;
    
      STARTUPINFO si;
      PROCESS_INFORMATION pi;
      SECURITY_ATTRIBUTES  sa;
    
      HANDLE hread, hwrite;
    
      std::string tmp="";
    
          hdc= BeginPaint(hWnd,&ps);
    
          sa.bInheritHandle= true;
          sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
          sa.lpSecurityDescriptor = NULL;
    
          if(!CreatePipe(&hread,&hwrite,&sa,0))
          {
            TextOut(hdc,100,100,TEXT("Fehler beim Erstellen der Pipe"),30);
            EndPaint(hWnd,&ps);
            return -1;
          }
    
          si.cb = sizeof(STARTUPINFO);
          GetStartupInfo(&si);      
          si.hStdOutput= hwrite;
          si.hStdError=hwrite;
          si.dwFlags = STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES;
          si.wShowWindow = SW_SHOW;
          //ZeroMemory( &pi, sizeof(pi) );
    
          if( !CreateProcess(TEXT("c:\\Windows\\system32\\cmd.exe"), NULL , NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ))   
          {
            TextOut(hdc,100,500,TEXT("Fehler beim Erstellen des Prozesses"),35);
            EndPaint(hWnd,&ps);
            return -1;
          }
    
          CloseHandle(hwrite);
    
          while(true)
          {
            RtlZeroMemory(&buffer,1024);
            if(!ReadFile(hread,&buffer,1023,&bytesRead,NULL))
            {
              TextOut(hdc,200,400,TEXT("ende"),4);
              break;
            }
    
            TextOut(hdc,200,100,TEXT("start"),5);
            tmp+=buffer;
          }
    
          CloseHandle(hread);
          EndPaint(hWnd,&ps);
    
          // Close process and thread handles. 
          CloseHandle( pi.hProcess );
          CloseHandle( pi.hThread );
    


  • Nur noch als Anmerkung:
    Erstze: "STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES" durch

    STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES
    

    Und Du hast noch vergessen das "hStdInput" zu setzen!



  • jo danke

    cu



  • hi

    also ich habs ja nun geschafft auszulesen, doch schaff ich es nicht auch was an die cmd zu schicken, um dann das ergebnis auszulesen beispielesweise "dir"

    wie muss ich jetzt vorgehen??

    also ich dachte mir ich brauche dafür eine neue pipe(siehe neue pipe)
    und die hänge ich an hStdInput an ?! ...

    soweit richtig??

    dann hätte ich gedacht, dass ich mit WriteFile(..) der console schicken könnte sie soll "ir" machen

    also als zeichenkette wohl "dir\n" bei WriteFile(..) um auch gleich das ENTER bei zu haben

    und wenn ich dann erneut mit readfile auslese hätte ich gedacht, müsste ich die ausgabe von "dir" erhalten

    naja hat jedenfalls nicht geklappt ...

    also wo liegt mein denkfehler, bzw. wie müsste ich den code ergänzen/ändern??

    danke + cu

    error

    unsigned long bio;   //bytes in/out
    
      static HWND hwndEdit;
      char buf[1024];           //in buffer
      char buffer[]="dir\n";           //out buffer
    
      char app[] = "cmd.exe"; 
    
      STARTUPINFO si;
      SECURITY_ATTRIBUTES sa;
      PROCESS_INFORMATION pi;
      HANDLE read, newread, write, newwrite;  //pipe handles
    
        case WM_LBUTTONDOWN:
        sa.lpSecurityDescriptor = NULL;
        sa.nLength = sizeof(SECURITY_ATTRIBUTES);
        sa.bInheritHandle = true;
    
        //Pipe um vom Child zu lesen
        if(!CreatePipe(&newread,&read,&sa,0))
        {
          MessageBox(hWnd,TEXT("CreatePipe"),TEXT("FEHLER"),0);
          CloseHandle(read);
          CloseHandle(newread);
          return -1;
        }
    
        //neue pipe
        //Pipe um in Child zu schreiben
        if(!CreatePipe(&newwrite,&write,&sa,0))
        {
          MessageBox(hWnd,TEXT("CreatePipe"),TEXT("FEHLER"),0);
          CloseHandle(write);
          CloseHandle(newwrite);
          return -1;
        }
    
        si.cb = sizeof(STARTUPINFO);
        GetStartupInfoA(&si);      
        si.hStdOutput= read;
        si.hStdError=read;
        si.hStdInput=write;
        si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
        si.wShowWindow = SW_SHOW;
    
        //child process erzeugen
        if (!CreateProcess(NULL,app,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
        {
          MessageBox(hWnd,TEXT("CreateProcess"),TEXT("FEHLER"),0);
          CloseHandle(read);
          CloseHandle(newread);
          CloseHandle(write);
          CloseHandle(newwrite);
          return -1;
        }
    
        //nicht mehr benötigt? endlosschleife wenn nicht geschlossen!!!???
        CloseHandle(read);
        CloseHandle(write);
    
        //hier lesen wir aus der cmd
        while(true)
        {
          RtlZeroMemory(&buf,1024);
    
          if(ReadFile(newread,&buf,1023,&bio,NULL)==NULL)break;
    
          SendMessage(hwndEdit,EM_SETSEL,-1,0);
          SendMessage(hwndEdit,EM_REPLACESEL,FALSE,(LPARAM)buf); 
        }
    
        //jetzt wollen wir dir an die cmd schicken
    
        WriteFile(newwrite,&buffer, 10,&bio,NULL);
    
        //und das ergebnis wieder lesen
    
        //hier lesen wir dann wieder aus der cmd
        while(true)
        {
          RtlZeroMemory(&buf,1024);
    
          if(ReadFile(newread,&buf,1023,&bio,NULL)==NULL)break;
    
          SendMessage(hwndEdit,EM_SETSEL,-1,0);
          SendMessage(hwndEdit,EM_REPLACESEL,FALSE,(LPARAM)buf); 
        }
    
        //den Rest aufräumen
        CloseHandle(newread);
        CloseHandle(newwrite);
    
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    


  • hm sorry, aber es ist mir noch immer nicht klar, wie ich das mit dem schreiben machen muss ... jedenfalls geht das so wie oben dargestellt nicht

    danke für aufklärung

    cu

    error


Anmelden zum Antworten