Feststellen wenn ein Programm(Prozess) beendet wurde
-
Ich muss aus meinem Programm ein anderes Programm starten, und wenn es wieder beendet wurde entsprechend reagieren. Gibt es einen besseren Weg als einfach die ganzen Fenster abzusuchen bzw. mit CreateToolhelp32Snapshot() die Prozesse???
-
ShellExecuteEx, WaitForSingleObject
-
Versuchs mal mit dieser Funktion unter Windows
/***********************************************************************.FA* .FUNCTION [ spawning to an external Programm ] -------------------------------------------------------------------------- .DESCRIPTION Aufrufen eines externen eigenständigen Programms ohne dass eine DosBox erscheint -------------------------------------------------------------------------- .PARAMETER IN char *Appname Name des programms welches gestartet werden soll char *Cmdline Übergabeparameter des Programms -------------------------------------------------------------------------- .RETURNVALUE dwexitcode Exit code des Processes **********************************************************************.HE**/ unsigned long int SpawnWaitNoWindow(char *AppName,char *CmdLine) { TCHAR szCmdLine[LONGSTRINGLEN]; PROCESS_INFORMATION pi; STARTUPINFO si={sizeof(si)}; // da der erste Parameter gefüllt wird werden zumindest ab Visual C 5.0 alle anderen genullt unsigned long int dwExitCode; BOOL fSucess; sprintf(szCmdLine,"%s %s",AppName,CmdLine); fSucess=CreateProcess(AppName,szCmdLine,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si ,&pi); if (fSucess) { CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess,INFINITE); GetExitCodeProcess(pi.hProcess,&dwExitCode); CloseHandle(pi.hProcess); } else { dwExitCode=0xFFFFFFFFL; } return dwExitCode; }
-
und wenn du's non-blocking willst, dann kannste periodisch mit GetExitcodeProcess() pollen ob der prozess noch am leben ist (returns: STILL_ACTIVE wenn er noch läuft)
-
net schrieb:
und wenn du's non-blocking willst, dann kannste periodisch mit GetExitcodeProcess() pollen ob der prozess noch am leben ist (returns: STILL_ACTIVE wenn er noch läuft)

-
Danke!
-
Alternative für non Blocking wäre auch ein eigener thread.
Ein Hinweis diese Funktion is für einen speziellen Einsatzzweck in unsere Tool-Bibliothek bekommen, aber das sagt ja der Name
SpawnWaitNoWindow
Starte externes Programm mit Kommandozeilenoptionen
Warte bis das Programm beendet wird, und liefere den ReturnCode des Programms
Mache keine KonsolenFenster für das Programm aufDer ReturnCode ist wichtig, weil wir daran erkennen ob das externe Programm erfolgreich war oder nicht. Das geht aber nur dann wenn das Programm korrekt als C/C++ mit *int main( int argc , char argv[]) geschrieben wurde. Sonst funktionieren weder Kommandozeilenparameter noch Fehlermeldung
-
PAD schrieb:
Der ReturnCode ist wichtig, weil wir daran erkennen ob das externe Programm erfolgreich war oder nicht.
dumm ist nur, wenn das programm 0xFFFFFFFFL als return code zurück gibt.
besser wärebool SpawnWaitNoWindow(char *AppName,char *CmdLine, unsigned long *ReturnCode)