WinAPI: Durch Prozess1 den Prozess2 erzeugen

Eisi_GolBay

Grünschnabel
Hi ihr mir Helfenden!

Problem:
Ich bin WinAPI-Anfänger und weiß nicht wie ich bei meinem Programm weiter vorgehen muss. Es läuft fehlerfrei (nach langem Suchen und Probieren), aber es macht noch nicht das was ich will. Alles was ihr an Code seht habe ich mir aus dem Netz zusammengepuzzelt (anderst kann ich das nicht ausdrücken ;-))
Danke für jede Hilfe im voraus :)

Ziel:
Prozess1 erzeugt mit CreateProcess(...) einen Prozess2

Dateien
Ich habe zwei Dateien process1.cpp und process2.cpp zum editieren. Beide liegen in ihrem jeweils eigenen Ordner (Prozess1 und Prozess2)

Fragen
Wo muss ich den Code von Prozess2 implementieren, damit dieser ausgeführt wird.

Code Prozess1

Code:
#include "windows.h"
#include <stdio.h>
#include <iostream>
using namespace std;

void error();
void success();


//Aufgabenstellung: process1 erzeugt process2
//Jeder Prozess hat sein eigenes Konsolenfenster 

void main()
{
		char cmdline[100];
		char speiort[100]="...\\WORK_UB1\\process2\\Debug\\process2.exe";
		//char strcpy(char *s1, const char *s2);
		strcpy(cmdline, speiort);

		//*****Tätigkeiten von Prozess1
		//Prozess2 erzeugen
				
		STARTUPINFO si2;
		PROCESS_INFORMATION pi2;
		GetStartupInfo(&si2);
		si2.lpTitle = "Kind-Prozess";

		ZeroMemory( &si2,sizeof(si2));
		ZeroMemory( &pi2,sizeof(pi2)); 
		
		if(!CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 
                CREATE_NEW_CONSOLE, NULL, NULL, &si2, &pi2))
		{
			printf("Prozess2 nicht gestartet\n");
		}
		//ausgeben der Identität von Prozess2
		cout << pi2.hProcess << endl;
		cout << pi2.dwProcessId << endl;	
		
		//warten auf Beendigung von Prozess2 	(erfolgreich/nicht erfolgreich?)
		if( WaitForSingleObject(pi2.hProcess,INFINITE)==WAIT_OBJECT_0)
		{
			success();
		}
		else 
		{
			error();
		}
		
		//warten auf Beendigung von Prozess2 (erfolgreich/nicht erfolgreich?)
		if( WaitForSingleObject(pi2.hProcess,INFINITE)==WAIT_OBJECT_0)
		{ 
			success();
		}
		else 
		{
			error();
		}

		//Schliessen des Prozess-Handle von Prozess2 
		CloseHandle(pi2.hProcess);
		CloseHandle(pi2.hThread);

		//warten auf Beendigung von Prozess2 (erfolgreich/nicht erfolgreich?)
		if( WaitForSingleObject(pi2.hProcess,INFINITE)==WAIT_OBJECT_0)
		{
			success();
		}
		else 
		{
			error();
		}
	
		//Prozess1 beenden; 
		ExitProcess(0);
}

void error()
{
	printf("nicht erfolgreich\n");
}

void success()
{
	printf("erfolgreich\n");
}

Code Prozess2

Code:
//Identität von Prozess2 bestimmen (handle + processID)
//erst wenn ich weiß, wo ich den Code implementieren soll
//weiß ich (evtl.) was ich hier reinschreiben muss

//Identität Prozess2 ausgeben
cout << dwProcessId << endl;
cout << hProcess << endl;

//Identität Prozess2 bestimmen (handle + processID) und ausgeben
		
cout << dwProcessId << endl;
cout << hProcess << endl;
		
//warten bis CR eingegeben wird 
char dum;
do
{
//Aufforderung
printf( "Eingabe CR\n" );
//Eingabe
scanf( "%c", &dum );
}
while ( dum == ' ' );

//700 msec warten 
Sleep(700);

//Prozess2 beenden
ExitProcess(0);
 
Danke für die nette Antwort deepthroat!
Gesagt getan, gehe man davon aus, der Prozesscode steht in der main() -->

Frage
Wieso darf ich keine Konsoleneingabe durchführen? Was blockiert den Aufforderungsaufruf für die Konsoleneingabe?

Gruß
 
Zuletzt bearbeitet:
Danke für die nette Antwort deepthroat!
Gesagt getan, gehe man davon aus, der Prozesscode steht in der main() -->

Frage
Wieso darf ich keine Konsoleneingabe durchführen? Was blockiert den Aufforderungsaufruf für die Konsoleneingabe?
Wie kommst du darauf das irgendwas blockieren würde?

Die Eingabe wird übrigens normalerweise zeilenweise gepuffert, d.h. du mußt die Eingabetaste drücken bevor die Verarbeitung der eingegebenen Zeichen beginnt.

Gruß
 
Ich habe mich wohl falsch ausgedrückt...

Es passiert folgendes:
Ich führe mein Programm aus
Es öffnet sich das Konsolenfenster von process1.exe
Konsolenfenster von process1 gibt Handle + ID aus
Es öffnet sich das Konsolenfenster von process2.exe
Es schließt sich das Konsolenfenster von process2.exe
In Konsolenfenster von process1 wird anschließend//
erfolgreich
erfolgreich
nicht erfolgreich //
ausgegeben. ENDE

Eigentlich müsste ich aber für das weiterlaufen von process2 einen char eingeben,
-->"Eingabe CR" <-- doch ich werde nicht zu einer Eingabe aufgefordert... d.h für mich, dass die Eingabeaufforderung blockiert bzw. besser ausgedrückt gar nicht aufgerufen wird.

Warum?

Gruss
 
Zurück