Ausgaben eines Skripts im Aufrufenden Dialog empfangen
-
Hallo zusammen,
ich habe folgendes Problem:
Ich starte ein Perl-Skript aus einer Appliaktion heraus in einem eigenen Konsolenfenster. Die Ausgaben des Skripts möchte ich in der C++-Applikation zurücklesen. Ich habe bisher auch schon Code implementiert (s.u.) aber beim Starten des Prozesses sehe ich nur ganz kurz ein Konsolenfenster, das sofort wieder geschlossen wird.
Normalerweise ist doch die Ausgabe eines Skripts in der Konsole standardmässig auf STDOUT?
// Setzen des sa-Struct sa.nLength=sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor=NULL; sa.bInheritHandle=TRUE; // Holen des Handle für STDIN hStdIn=GetStdHandle(STD_INPUT_HANDLE); // Erstellen der STDOUT-Pipe des Kind-Prozesses if(!CreatePipe(&hChildStdOutRd,&hChildStdOutWr,&sa,0)) m_log.SetWindowText("OnGo: Kann die Lese-Pipe nicht erstellen"); // Erstellen eines nicht-vererbbaren Read-Handles und Schließen des vererbbaren fSuccess=DuplicateHandle(GetCurrentProcess(),hChildStdOutRd, GetCurrentProcess(),&hChildStdOutRdDup,0, FALSE,DUPLICATE_SAME_ACCESS); if(!fSuccess) m_log.SetWindowText("OnGo: Duplizieren des Handles fehlgeschlagen\n"); CloseHandle(hChildStdOutRd); switch(action) { case A_GET: { // GET cmd+=options; cplCmd="cmd.exe /k perl cm.pl -get "+cmd+" < "+openFile; //MessageBox(cplCmd.GetBuffer(256), "Skriptaufruf", MB_ICONSTOP | MB_OK); // Child-Prozess erstellen fSuccess=CreateChildProcess(cplCmd); if(!fSuccess) m_log.SetWindowText("OnGo: Erstellen des Prozesses fehlgeschlagen"); ReadFromPipe();// Setzten der STARTUP-Information und starten des umgeleiteten Prozesses BOOL CMainDialog::CreateChildProcess(CString cmd) { PROCESS_INFORMATION pi; STARTUPINFO si; BOOL bFuncRet=FALSE; // Setzen des Startup Info-Structs ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.dwFlags=STARTF_USESTDHANDLES; si.hStdOutput=hChildStdOutWr; si.hStdError=hChildStdOutWr; si.wShowWindow=SW_SHOW; // Starten des Prozesses mit Umleitung bFuncRet=CreateProcess(NULL, cmd, // Kommandozeile: Perl-Aufruf NULL, // Prozess-Security-Attribute NULL, // Primäre Thread-Security-Attribute TRUE, // Handles werden vererbt CREATE_NEW_CONSOLE, // Erstellungs-Flags NULL, // use parent´s environment NULL, // use parent´s directory &si, // STARTUPINFO-Pointer &pi); // receives PROCESS_INFORMATION if(bFuncRet==0) { m_log.SetWindowText("CreateChild: Fehler beim Erstellen des Kind-Prozesses"); ExitProcess(0); } else { m_log.SetWindowText("Success!"); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return bFuncRet; } }// Kontrolliert den Handle für den Input void CMainDialog::ReadFromPipe(void) { DWORD dwRead, dwWritten; CHAR chBuf[BUFFER]; // Schließen der Write-Pipe, bevor von der Read-Pipe gelesen wird if(!CloseHandle(hChildStdOutWr)) m_log.SetWindowText("ReadPipe: Write-Pipe kann nicht geschlossen werden"); // Lesen der Ausgaben vom Child-Prozess und Ausgabe auf STDIN for(;;) { if(!ReadFile(hChildStdOutRdDup,chBuf,BUFFER,&dwRead,NULL) || dwRead==0) break; if(!WriteFile(hStdIn,chBuf,BUFFER,&dwWritten,NULL) || dwRead==0) break; } }
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.