GUi für Komandozeilen Prog
-
Habe das ,al so getest:
char lineBuffer[128]; FILE *flist; // statt listuser.exe eventuell vollständigen Pfad, je nachdem if( (flist = _popen( "C:\\listuser.exe -all", "rt" )) == NULL ) AfxMessageBox("Fehler beim Ausführen von listuser.exe"); else { while( !feof( flist) ) { if( fgets( lineBuffer, 128, flist) != NULL ) AfxMessageBox(lineBuffer); } }aber er meldet immer den Fehler. Obwohl die datei 100% da ist.
-
Ich habe das mal so versucht:
#include <stdio.h> #include <stdlib.h> #include <conio.h> void main() { char *cmd = "C:\\listuser.exe -all"; char buf[BUFSIZ]; FILE *ptr; if ((ptr = _popen(cmd, "r")) != NULL) { while (fgets(buf, BUFSIZ, ptr) != NULL) { printf("%s", buf); } } getch(); }Das geht ganz super!
Doch schreibe ich in einer MFC anwendung das:
char *cmd = "C:\\listuser.exe -all"; char buf[BUFSIZ]; FILE *ptr; if ((ptr = _popen(cmd, "r")) != NULL) { while (fgets(buf, BUFSIZ, ptr) != NULL) { printf("%s", buf); } }lauft nichts es kommt keine Msg.
-
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.