Prozess Handling
-
Hallo zusammen
Ich wälze jetzt schon bereits seid über 2 Stunden im google und in der MSDN, wo ich was finden kann über Prozesshandling.
Eigentlich muss ich nur was ganz simples machen:
Meine Anwendung(parent) soll eine andere Anwendung(child) starten, und er dann weiterlaufen, wenn die child Anwendung wieder beendet ist.
Jetzt hab ich das ganze mit CreateProcess() versucht.
HINSTANCE proz; DWORD procze; STARTUPINFO StartInfo; memset(&StartInfo,0,sizeof(STARTUPINFO)); StartInfo.cb = sizeof(STARTUPINFO); StartInfo.dwFlags = STARTF_USESHOWWINDOW; StartInfo.wShowWindow = SW_SHOW; PROCESS_INFORMATION ProcInfo; if (! CreateProcess(0,"notepad.exe",0,0,0,0,0,0,&StartInfo,&ProcInfo) ) MessageBox(NULL,"failed",NULL,MB_OK);So, das funktioniert auch alles wunderbar. Notepad öffnet und ich kann alles wunderbar eintippen.
So, jetzt kommen wir zur Beendung des Prozesses, also: Meine Parent Anwendung soll dann weiterlaufen, wenn notepad wieder geschlossen wurde.
Bis jetzt hab ich diese Versuche gestartet, die direkt nach dem oben aufgeführten Code folgen, aber erfolglos waren:
Versuch 1
DWORD exetit = 0; while(GetExitCodeProcess(&ProcInfo.hProcess,&exetit) != STILL_ACTIVE ){}Versuch 2
WaitForSingleObject(&ProcInfo.hProcess,INFINITE);Versuch 3
HANDLE hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, ProcInfo.dwProcessId); while(GetExitCodeProcess(hProc,&exetit) != STILL_ACTIVE ){}Wie gesagt, war alles erfolglos. Ich hab mir auch schon die Prozessliste angeschaut. Der Prozess, der neu erzeugt wird, wird nach dem Beenden von Notepad auch wieder terminiert.
Ich hoffe, dass ihr mir weiterhelfen könnt.
-
Dann nimm halt versuch 3:
WaitForSingleObject(ProcInfo.hProcess,INFINITE);Oder les nächstes mal einfach die Doku...
http://msdn.microsoft.com/library/en-us/dllproc/base/creating_processes.asp
Und beachte dass Dein Code nur in der ANSI-Version funktioniert, nicht aber in der Unicode-Version...
-
ja, so hab ich das ja auch schon gehabt
problem bei der sache ist, dass der prozess (in diesem falle meine anwendung) noch gar nicht terminiert ist, er aber trotzdem bei WaitForSingleObject() sagt, dass es so ist.
-
also ich hab jetzt einfach mal den original code aus der msdn genommen und das ausprobiert.
zu meinem erstaunen funktioniert das auch, aber ich kann nicht wirklich unterschiede, bis auf die initialisierungen, zu meiner version feststellen
-
Handelt es sich um die gleiche Anwendung?
Viele Anwendungen (z.B. Explorer) checken, ob schon eine Instanz läuft, und wenn ja, geben die Kommandozeile an die laufende Instanz weiter und beenden sich selbst. Damit wird der gestartete prozeß praktisch sofort beendet, obwohl ein neues Fenster aufgeht.
Ansonsten - die Initialisierungen ochmal prüfen