<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ausgaben eines Skripts im Aufrufenden Dialog empfangen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes Problem:</p>
<p>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.</p>
<p>Normalerweise ist doch die Ausgabe eines Skripts in der Konsole standardmässig auf STDOUT?</p>
<pre><code>// 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(&amp;hChildStdOutRd,&amp;hChildStdOutWr,&amp;sa,0))
				m_log.SetWindowText(&quot;OnGo: Kann die Lese-Pipe nicht erstellen&quot;);
			// Erstellen eines nicht-vererbbaren Read-Handles und Schließen des vererbbaren
			fSuccess=DuplicateHandle(GetCurrentProcess(),hChildStdOutRd,
									 GetCurrentProcess(),&amp;hChildStdOutRdDup,0,
									 FALSE,DUPLICATE_SAME_ACCESS);
			if(!fSuccess)
				m_log.SetWindowText(&quot;OnGo: Duplizieren des Handles fehlgeschlagen\n&quot;);
			CloseHandle(hChildStdOutRd);

			switch(action)
			{
				case A_GET:
				{
					// GET
					cmd+=options;
					cplCmd=&quot;cmd.exe /k perl cm.pl -get &quot;+cmd+&quot; &lt; &quot;+openFile;

					//MessageBox(cplCmd.GetBuffer(256), &quot;Skriptaufruf&quot;, MB_ICONSTOP | MB_OK);

					// Child-Prozess erstellen
					fSuccess=CreateChildProcess(cplCmd);
					if(!fSuccess)
						m_log.SetWindowText(&quot;OnGo: Erstellen des Prozesses fehlgeschlagen&quot;);
					ReadFromPipe();
</code></pre>
<pre><code>// 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(&amp;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
					&amp;si,						// STARTUPINFO-Pointer
					&amp;pi);						// receives PROCESS_INFORMATION
	if(bFuncRet==0)
	{
		m_log.SetWindowText(&quot;CreateChild: Fehler beim Erstellen des Kind-Prozesses&quot;);
		ExitProcess(0);
	}
	else
	{
		m_log.SetWindowText(&quot;Success!&quot;);
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
		return bFuncRet;
	}
}
</code></pre>
<pre><code>// 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(&quot;ReadPipe: Write-Pipe kann nicht geschlossen werden&quot;);
	// Lesen der Ausgaben vom Child-Prozess und Ausgabe auf STDIN
	for(;;)
	{
		if(!ReadFile(hChildStdOutRdDup,chBuf,BUFFER,&amp;dwRead,NULL) || dwRead==0)
			break;
		if(!WriteFile(hStdIn,chBuf,BUFFER,&amp;dwWritten,NULL) || dwRead==0)
			break;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/119292/ausgaben-eines-skripts-im-aufrufenden-dialog-empfangen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Jul 2026 19:02:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/119292.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Aug 2005 14:49:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ausgaben eines Skripts im Aufrufenden Dialog empfangen on Tue, 30 Aug 2005 14:49:55 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes Problem:</p>
<p>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.</p>
<p>Normalerweise ist doch die Ausgabe eines Skripts in der Konsole standardmässig auf STDOUT?</p>
<pre><code>// 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(&amp;hChildStdOutRd,&amp;hChildStdOutWr,&amp;sa,0))
				m_log.SetWindowText(&quot;OnGo: Kann die Lese-Pipe nicht erstellen&quot;);
			// Erstellen eines nicht-vererbbaren Read-Handles und Schließen des vererbbaren
			fSuccess=DuplicateHandle(GetCurrentProcess(),hChildStdOutRd,
									 GetCurrentProcess(),&amp;hChildStdOutRdDup,0,
									 FALSE,DUPLICATE_SAME_ACCESS);
			if(!fSuccess)
				m_log.SetWindowText(&quot;OnGo: Duplizieren des Handles fehlgeschlagen\n&quot;);
			CloseHandle(hChildStdOutRd);

			switch(action)
			{
				case A_GET:
				{
					// GET
					cmd+=options;
					cplCmd=&quot;cmd.exe /k perl cm.pl -get &quot;+cmd+&quot; &lt; &quot;+openFile;

					//MessageBox(cplCmd.GetBuffer(256), &quot;Skriptaufruf&quot;, MB_ICONSTOP | MB_OK);

					// Child-Prozess erstellen
					fSuccess=CreateChildProcess(cplCmd);
					if(!fSuccess)
						m_log.SetWindowText(&quot;OnGo: Erstellen des Prozesses fehlgeschlagen&quot;);
					ReadFromPipe();
</code></pre>
<pre><code>// 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(&amp;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
					&amp;si,						// STARTUPINFO-Pointer
					&amp;pi);						// receives PROCESS_INFORMATION
	if(bFuncRet==0)
	{
		m_log.SetWindowText(&quot;CreateChild: Fehler beim Erstellen des Kind-Prozesses&quot;);
		ExitProcess(0);
	}
	else
	{
		m_log.SetWindowText(&quot;Success!&quot;);
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
		return bFuncRet;
	}
}
</code></pre>
<pre><code>// 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(&quot;ReadPipe: Write-Pipe kann nicht geschlossen werden&quot;);
	// Lesen der Ausgaben vom Child-Prozess und Ausgabe auf STDIN
	for(;;)
	{
		if(!ReadFile(hChildStdOutRdDup,chBuf,BUFFER,&amp;dwRead,NULL) || dwRead==0)
			break;
		if(!WriteFile(hStdIn,chBuf,BUFFER,&amp;dwWritten,NULL) || dwRead==0)
			break;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/861496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/861496</guid><dc:creator><![CDATA[diritari]]></dc:creator><pubDate>Tue, 30 Aug 2005 14:49:55 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgaben eines Skripts im Aufrufenden Dialog empfangen on Wed, 31 Aug 2005 15:42:51 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=403" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=4" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/862192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862192</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 31 Aug 2005 15:42:51 GMT</pubDate></item></channel></rss>