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.


Anmelden zum Antworten