Win32: Ausgabe einer Konsolenanwendung "einfangen" - WIE?!

Hast du die handle dafür vieleicht in der funktion definiert?

wenn ja kann das net gut funktionieren.. versuch mal die HANDLE als static zu definieren...

also nicht mehr
HANDLE hPipeRead;

sondern versuch mal

static HANDLE hPipeRead;
 
Danke für den Tipp! :-) :-) :-)

Code:
static BOOL CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
   static STARTUPINFO	si;
   SECURITY_ATTRIBUTES sa;
   static HANDLE hPipeOutRead=INVALID_HANDLE_VALUE;
   static HANDLE hPipeOutWrite=INVALID_HANDLE_VALUE;
   PROCESS_INFORMATION	pi;
   char cPipeResult[BUFSIZE];
   DWORD dwBytesRead;

   switch (msg) {
      case WM_INITDIALOG:
         SetWindowText(hwndDlg,"CreateProcess-Test");
         //
         // Erstellen der Pipe
         sa.nLength=sizeof(sa);
         sa.bInheritHandle=TRUE;
         sa.lpSecurityDescriptor=NULL;
         CreatePipe(&hPipeOutRead,&hPipeOutWrite, &sa, 0);
         //
         // Definieren der StartupInfos von Kindprozessen
         ZeroMemory(&si, sizeof(STARTUPINFO));
         si.cb=sizeof(STARTUPINFO);
         si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
         si.wShowWindow=SW_HIDE;
         si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
         si.hStdOutput=hPipeOutWrite;
         si.hStdError=GetStdHandle(STD_ERROR_HANDLE);
         return TRUE;
      case WM_COMMAND:
         switch (LOWORD(wParam)) {
            case IDOK:
               //
               // Starten eines Kindprozesses
               ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
               CreateProcess(NULL, "ipconfig /all", NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
               WaitForSingleObject(pi.hProcess, INFINITE);
               CloseHandle(pi.hThread);
               CloseHandle(pi.hProcess);
               memset(cPipeResult,0,BUFSIZE);
               ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL);
               SetDlgItemText(hwndDlg,IDTEXT,cPipeResult);
               break;
            case IDCANCEL:
               EndDialog(hwndDlg,0);
               return 1;
            }
            return TRUE;
         case WM_CLOSE:
            EndDialog(hwndDlg,0);
            return 0;
   }
   return FALSE;
}
FUNKTIONIERT! Jetzt muß ich nur noch die oben beschriebene bidirektionale Kommunikation zum erstellten Prozess (natürlich nicht zum "ipconfig /all", sondern zu einem "ftp" o.ä.) hinbekommen - dann bin ich glücklich... :)
 
Zuletzt bearbeitet:
Wieso machst du es dir s kompliziert?
Du willst so wie ich das sehen einfach nur FTP (oder what ever) über deine selbstgeschriebenes programm machen oder?

Benutze doch die Funktionen die C++ dir da bietet!
Ist doch wesentlich komfortabler...

Schau dir dazu doch einfach mal

"CInternetSession"
und
"CFtpConnection"
an

Das dürfte dir auch helfen...

Auch interessant ist der Beitrag uas der MSDN
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/ftp_sessions.asp
 
es geht noch nicht unbedingt um FTP hier, sondern es geht um bidirektionale kommunikation.


und ich hab kein problem damit gehabt als ich es versucht hab, hab das progy aber leider net mehr, sonst hätt ich dir die klasse gezeigt.
 
Original geschrieben von chibisuke
es geht noch nicht unbedingt um FTP hier, sondern es geht um bidirektionale kommunikation.
Genau - FTP war nur ein Beispiel.

Konkreter: Bei uns in der Fa. haben wir Legato Networker als Datensicherungstool im Einsatz. Über installierte Networker Clients hat man die Möglichkeit, z.B. Datendurchsätze der im SAN angeschlossenen Bandlaufwerke auszulesen. Ich möchte nun (über einen installierten Networker Client) periodisch Informationen vom Server holen, da ich nachts nicht unbedingt ständig in's System schauen möchte, um Optimierungsmöglichkeiten bei der Verteilung der Ressourcen zu finden. Da der Client jedoch über RPC mit dem Server kommuniziert und ich weder Lust habe, mir die Netzkommunikation über RPC mit dem Sniffer anzuschauen und mit einem eigenen Programm einen Networker Client zu simulieren (mal davon abgesehen, dass das sicher nicht ganz legal ist), noch mich mit RPC generell zu beschäftigen (ich hatte mal einen Post dazu - ohne viele Antworten), wollte ich die mitgelieferte Konsolenanwendung über ein selbstgeschriebenes Proggi dazu animieren, mir Infos auszuspucken, die ich dann ggf. in eine Datenbank für spätere Auswertung schreiben kann. Dazu benötige ich allerdings eine bidirektionale Kommunikation, da ich die Konsolenanwendung:
1. aufrufen
2. mit Daten füttern und
3. die Antworten auswerten muß.

Sind jetzt alle Fragen hinsichtlich Sinn und Verstand meiner Nerverei geklärt? :-)

@chibisuke: Wir sind schon so weit - jetzt nur nicht aufgeben ;)... Danke bis dahin!

Gruß
René
 
Zuletzt bearbeitet:
alles klar, ich hab nix gesagt :) dachte blos du wolltest auf sachen wie FTP / Telnet etc. hinaus, weil du das so ausdrücklich sagtest (nicht ipconfig sondern ftp etc.) wie man sich täuschen kann :)
 
Zurück