Ein externes Programm starten & Ausgabe in mein Programm umleiten



  • Hi,

    wie schon gesagt ich möchte ein externes Programm starten und alle Fehlermeldungen, Ausgaben in mein Program umleiten, damit das ganze in meinem Programm erscheint.

    Hat jemand mal ein Bsp für mich wie ich es machen kann?

    mfg

    w.r



  • schonmal gesucht, in der faq, im forum? würde wetten, du findest was. nur nicht hier im ansi c, is betriebssystemabhängig.. also ma winapi oder linux forum checken!



  • ja, du hast Recht!!
    Leider wollte ich es in C haben.

    mfg

    w.r



  • Ja wer sagt das es in C nicht möglich ist? (All's wenn es was gäbe was nicht in C möglich wäre 🙂 ). Such mal nach Pipe's [_pipe();] ein Bsp. findest in der MSDN!
    MfG schirrmie



  • popen (3)



  • Bitte schlagt mich nicht! 😕
    Ich weiß, dass es nicht ANSI ist, aber ich will ihm trotzdem versuchen zu helfen.

    Also Du könntest mit system(char*) das externe Programm aufrufen, ist zwar nicht sehr elegant, funktioniert aber.

    Du kannst mit < den stdin umlenken,
    mit > den stdout und
    mit 2> den stderr.

    also für dich (externes Programm heißt z.B. test):
    char aufruf[100];
    strcpy(aufruf,"test.exe");
    strcat(aufruf," > daten.txt");
    strcat(aufruf," 2> errors.txt");
    system(aufruf);

    dann könntest du die Daten aus den Dateien einlesen und in deinem Programm verwenden.

    Gruß Patrick

    p.s. ist leider alles kein ANSI, aber zumindest ein Lösungsansatz



  • Und trotzdem viel zu umständlich 🙄 .

    Warum missbrauchen eigentlich die meisten immer system()??



  • wie würdest Du es dann machen??



  • Hallo,

    Du musst die Ausgabe in eine PIPE umleiten...

    So muss das in etwa aussehen.

    HANDLE newstdout,read_stdout;  
    
    //PIPE erzeugen...
    
    CreatePipe(&read_stdout,&newstdout,&saProcess,30000);
    
    si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; 
    si.wShowWindow = SW_HIDE; 
    si.hStdOutput = newstdout;
    si.hStdError = newstdout;
    
    // Prozess starten. Ausgabe wird umgeleitet...
    
    ::CreateProcess (szApplication,szCmdLine,&saProcess, NULL,TRUE,0,NULL,NULL,&si,&piProcess);
    
    ::WaitForSingleObject(piProcess.hProcess,INFINITE);
    
    ExitCode=0;
    
    ::GetExitCodeProcess(piProcess.hProcess , & ExitCode);
    
    // Puffer für Ausgabe
    char buf[30000]="";
    
    unsigned long bread;   //bytes gelesen
    unsigned long avail;   //bytes verfügbar
    
    PeekNamedPipe(read_stdout,buf,30000,&bread,&avail,NULL);
    
    if(avail!=0)
    	ReadFile(read_stdout,buf,30000,&bread,NULL);
    


  • paddy82 schrieb:

    wie würdest Du es dann machen??

    Mit einer Funktion, die auch dafür vorgesehen ist, wie eben z. B. popen(), dass [0x[90]| eingebracht hat. Das ist zwar auch betriebssystemabhängig, aber tausend mal besser als die Verbindung von system() und irgendwelchen Konsolenbefehlen.

    @T2000
    Na, das sieht mir aber sehr nach Windows bzw. WinAPI aus.

    @white.rabbit
    Für welches OS compilierst du? Dann verschieb ich dich ins entsprechende Forum.



  • Hi,

    das ja das Problem ich wollte es für Windows und für Linux wissen!

    Und wollte natürlich ohne viel umzuschreiben auf beiden OS benutzen.

    mfg

    w.r


Anmelden zum Antworten