[C/C++] WriteFile();

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von DeltaFox, 24. Juni 2008 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 24. Juni 2008
    WriteFile();

    Hallo,
    ich wollte ein Programm schreiben was die Eingaben an die CMD sendet via CreatePipe();, dass Programm soll darauf hin auch die Antwort auslesen und ausgeben.

    Der Quellcode dazu:
    Code:
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <iostream.h>
    
    #define BUFSIZE 512
    
    int main(){
     HANDLE stdinRd, stdinWr, stdoutRd, stdoutWr;
     SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
     STARTUPINFO si;
     PROCESS_INFORMATION pi;
     DWORD stuff,st;
     char buff[BUFSIZE], recvBuff[500];
     
     
     if(!CreatePipe(&stdinRd, &stdinWr, &sa, 0) || !CreatePipe(&stdoutRd, &stdoutWr, &sa, 0)) {
     printf("Error Creating Pipes");
     }
     
     GetStartupInfo(&si);
     //si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
     si.dwFlags |= STARTF_USESTDHANDLES;
     si.wShowWindow = SW_HIDE;
     si.hStdOutput = stdoutWr;
     si.hStdError = stdoutWr;
     si.hStdInput = stdinRd;
     if(!CreateProcess("C:\\Windows\\System32\\cmd.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
     printf("Error starting CMD");
     }
     
     while(1) {
     Sleep(100);
     printf("1");
     GetExitCodeProcess(pi.hProcess, &stuff);
     if(stuff != STILL_ACTIVE) break;
     
     PeekNamedPipe(stdoutRd, NULL, 0, NULL, &stuff, NULL);
     if(stuff != 0) {
     printf("3");
     ZeroMemory(buff, sizeof(buff));
     do {
     printf("2");
     ReadFile(stdoutRd, buff, BUFSIZE, &stuff, NULL);
     printf(buff);
     } while(stuff == 1000);
     }
     
     scanf("%s",recvBuff);
     printf(recvBuff);
     WriteFile(stdinWr, recvBuff, strlen(recvBuff+1), &st, NULL);
     Sleep(1000);
     }
    
     return 0;
    }
    Das erstmal auslesen funktioniert auch Einwandfrei, nur wenn es dann darum geht das Eingegebene an die CMD zu senden und die Antwort auszugeben scheitert es. Ich hab auch einwenig rumprobiert und ich habe das Gefühl das die Eingabe gar nicht richtig gesendet wird. Weil die Antwort von der CMD die ich mit PeekNamedPipe(); erhalte 0 Byte lang ist.

    Kann mir jemand ein Tipp geben was Falsch sein könnte ?

    Liebe Grüße.
     
  2. 26. Juni 2008
    AW: WriteFile();

    Problem gefunden char hab ich übergeben aber char* wird benötigt.

    Nun habe ich es geändert nur funktioniert die Eingabe nun nicht richtig. Die Eingabe wir in eine string var gespeichert dir später in einen char* umgewandelt wird, nur funktioniert es nicht wenn man es in die Konsole eingibt. Es funktioniert wenn ich die var im Quellcode deklariere.

    Code:
     cin >> test;
     char *cmd_ptr = new char[test.size()+1];
     strcpy(cmd_ptr,test.c_str());
     len=strlen(cmd_ptr);
     printf("len: %i\n",len);
     printf("eingabe: %s\n",cmd_ptr);
     WriteFile(stdinWr, cmd_ptr, len, &st, NULL);
    
    Das geht nicht.

    Code:
     test="cd\n";
     char *cmd_ptr = new char[test.size()+1];
     strcpy(cmd_ptr,test.c_str());
     len=strlen(cmd_ptr);
     printf("len: %i\n",len);
     printf("eingabe: %s\n",cmd_ptr);
     WriteFile(stdinWr, cmd_ptr, len, &st, NULL);
    
    So geht es aber.
    Daher meine Schlussfolgerung das es am Input liegt.

    Kann mir jemand weiterhelfen ?
     
  3. 26. Juni 2008
    AW: WriteFile();

    Keine Ahnung was du Falsch machst aber bei mir funktionieren beide Codes.
    Was geht den genauer nicht? Du hast ja ein Ausgabe zum Testen eingefugt die
    verhält sich doch beide malle gleich, also man kriegt immer das zu sehen was man eingibt,
    jedenfalls ist es bei mir so. Dann müsste es theoretisch mit dem Schreiben in die Datei
    klappen.....

    Andere Sache warum kopierst du den String extra in ein *char?
    Ein String ist eine Klasse die mit zusätzlichen Funktionen einen *char Verwaltet und somit
    kannst du auf diesen auch direkt zu greifen, so brauchst ihn auch nicht zu kopieren nur um
    ihn in eine Datei zu Schreiben; ein Beispiel:

    Code:
    WriteFile(stdinWr, test.c_str(), test.size(), &st, NULL);
    
    Mfg Rushh0ur
     
  4. 26. Juni 2008
    AW: WriteFile();

    Ich glaub du weist net genau was das Programm macht oder ?
    Das Programm startet die CMD und ermöglicht es Eingabe und Ausgaben von der Cmd auf das Programm umzulenken.

    D.h. Ich schreibe mit WriteFile(); nicht in in eine Datei(Textfile z.b.) sondern sende es an die CMD.

    Die Ausgaben funktionieren das is klar. Aber bei der unteren Version, des oberen Posts, wie "cd" ausgeführt und die Antwort der CMD ausgegeben und bei der oberen nicht dort wird keine Antwort ausgegeben und das Programm hängt sich auch mehr oder weniger auf.

    Und es gibt eine kleine Feinheit bei der Ausgabe, die ich eingebaut hab, bei der unteren wird "cd" <Zeilenumbruch> ausgegeben und bei der oberen wenn cd\n eingeben wird nur "cd\n".

    Trotzdem schonmal danke.

    Edit:\\Danke meine Dummheit hat gesiegt.. is ja klar wenn man "\n" direkt mit eingibt das es net geht.

    Code:
    cin >> test;
    test+="\n";
    WriteFile(stdinWr, test.c_str(), test.size(), &st, NULL);
    
    So gehts für alle die es wissen wollen.

    Ansonsten danke Rushh0ur hat mir geholfen ;>
     
  5. 26. Juni 2008
    AW: WriteFile();

    [X] Erledigt.

    ~closed~

    Mfg,

    Kolazomai
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.