GUi für Komandozeilen Prog



  • Tauscht bei der MFC ausgabe mal das printf("%s", buf);
    mit MessageBox("%s", buf);



  • Ah was is los. Sicher so:

    MessageBox(buf);



  • Ah was is los. Sicher so:

    MessageBox(buf);



  • sorry, mein Fehler, es sollte ja eine GUI für dieses Kommandozeilenprogramm werden, _popen funktioniert aber nur in Konsolenprogrammen. Es wird dann deutlich komplizierter, deswegen kann ich hierzu diesen Artikel hier

    http://dev-www.codeguru.com/misc/redirect.shtml

    empfehlen.

    Und eine ganze Anwendung, die Kommandozeilenprogramm-Ausgaben in einem GUI darstellt, gibt es hier

    http://codeguru.earthweb.com/console/QuickWin.shtml

    da kann man die grundsätzliche Technik (Pipes) erkennen.

    MfG



  • Ich habe das mal mit der klasse versucht und twar so:

    In der *Dlg.cpp meines Progs habe ich die Redirect.h so eingebunden:

    #include "Redirect.h"
    

    Und in der *dlg.h meines Progs steht:

    class CRedirect;
    

    ganz oben. Und etwas weiter unten

    CRedirect *m_pRedirect;
    

    Dann habe ich auf klick dieses Event ausgelöst:

    CRedirect Redirect("C:\\Temp\\sample.bat", m_EditOutput);
    Redirect.Run();
    

    Nur leider bekomme ich folgenden Fehler:

    CRedirect::CRedirect(const char *,class CEdit *,const char *)' : Konvertierung des Parameters 2 von 'class CEdit' in 'class CEdit *' nicht moeglich

    Ich weis nich was ich falsch mache. Ich habe m_EditOutput als CEdit deklariert.



  • UP



  • du mußt nur die Adresse des CEdit-Objekts übergeben, dann ist der Compiler-Fehler weg:

    CRedirect Redirect("C:\\Temp\\sample.bat", &m_EditOutput);
    

    MfG



  • Das hatte ich auch mal versucht. Da es auch so in der Demo stand die man saugen konnte. Aber dann bekomme ich diese Fehler:

    error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual __thiscall CRedirect::~CRedirect(void)" (??1CRedirect@@UAE@XZ)

    error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual void __thiscall CRedirect::Run(void)" (?Run@CRedirect@@UAEXXZ)

    error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall CRedirect::CRedirect(char const *,class CEdit *,char const *)" (??0CRedirect@@QAE@PBDPAVCEdit@@0@Z)



  • du hast doch hoffentlich die Datei "Redirect.cpp" mit in die .cpp-Dateien deines Projekts aufgenommen, oder? (es sieht aber so aus, als ob du nur die "redirect.h" hinzugefügt hast)

    MfG



  • Hi !

    So kannst Du Dir die Ausgabe eines Konsolenprogramms in Deine GUI-Anwendung anzeigen lassen:

    #define BUFFSIZE 4096 
    char cPipeResult[BUFFSIZE];
    memset(cPipeResult,0,BUFFSIZE); 
    DWORD dwBytes =0; 
    PROCESS_INFORMATION PROCCINFO;
    LPSECURITY_ATTRIBUTES lpPipeAttributes = NULL;
    HANDLE hReadPipe;
    HANDLE hWritePipe;
    SECURITY_ATTRIBUTES SecAttribs;
    SecAttribs.lpSecurityDescriptor = NULL;
    SecAttribs.bInheritHandle = TRUE;
    SecAttribs.nLength = sizeof(SecAttribs);
    if( ! CreatePipe( &hReadPipe,  &hWritePipe,  &SecAttribs, 0))
    {
    	AfxMessageBox("Konnte Pipe nicht erstellen");
    }
    else // Ok  Prozess vorbereiten
    {
    	STARTUPINFO INFO;
    	INFO.cb=sizeof(STARTUPINFO);
    	INFO.lpReserved=NULL;
    	INFO.lpDesktop= NULL;
    	INFO.lpTitle=NULL;
    	INFO.dwX=0;
    	INFO.dwY=0;
    	INFO.dwXSize=100;
    	INFO.dwYSize=100;
    	INFO.dwXCountChars=0;
    	INFO.dwYCountChars=0;
    	INFO.dwFillAttribute=NULL;
    	INFO.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW|STARTF_USEPOSITION;
    	INFO.wShowWindow= SW_SHOWDEFAULT;
    	INFO.cbReserved2=0;
    	INFO.lpReserved2=NULL;
    	INFO.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    	INFO.hStdOutput= hWritePipe;
    	INFO.hStdError= GetStdHandle(STD_ERROR_HANDLE);
    
    	CreateProcess( "C:\\A\\Debug\\A.exe",NULL, NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE|
    	    		  NORMAL_PRIORITY_CLASS, NULL, NULL, &INFO, &PROCCINFO); 
        WaitForSingleObject(PROCCINFO.hProcess, 5000);
        ReadFile(hReadPipe, cPipeResult, sizeof(cPipeResult), &dwBytes,NULL);
        AfxMessageBox(cPipeResult);
    }
    }
    

    // cPipeResult liefert die Ausgabe der Konsolenanwendung, kann z.B. in eine
    // CString Variable eingelesen werden.
    // C:\\A\\Debug\\A.exe ist meine Testdatei, das ist der Pfad zur
    Konsolenanwendung.
    // Möchte man die Ausgabe der Konsolenfensters vermeiden, kann man den Fenster-
    // stil SW_SHOWDEFAULT durch SW_HIDE ersetzen
    Gruß, J.


Anmelden zum Antworten