Warten auf Prg ende ?!
-
Ganz Simples Problem
Leider nicht für mich.
//Zuerst deklarieren wir die Strukturvariablen für die Übergabe an
//die API-Funktion:
TProcessInformation prozessinfo;
TStartupInfo startinfo;//Dann deklarieren wir die "Größe" der Strukturen im Speicher:
startinfo.cb = sizeof(TStartupInfo);
setmem(&startinfo,sizeof(TStartupInfo),0);//Mit CreateProcess starten wir die Anwendung, um später über die
//Struktur PROZESSINFO das Bestehen abfragen zu können
if(CreateProcess(NULL,Programm.c_str(),NULL,NULL,false,
NORMAL_PRIORITY_CLASS,NULL,
NULL,&startinfo,&prozessinfo)==TRUE)
{
//Speicher freigeben
CloseHandle(prozessinfo.hThread);
//DIE Warteschleife, die PROZESSINFO abfragt
while(WaitForSingleObject(prozessinfo.hProcess, 100) == WAIT_TIMEOUT)
Application->ProcessMessages();//Speicher freigeben
CloseHandle(prozessinfo.hProcess);
}wenn ich z.b. das Prg CMD starten lasse, aus CMD z.b. das NodePad, anschliessend CMD schliesse, erklärt diese Routine das für OK ..
jedoch sollte sie solange in der schleife verharren bis auch das NodePad wieder geschlossen wurde.
Wie kann ich jenes noch erreichen ??
(Das ganze wurde im Borland C++ Builder realisiert)Mfg R. Hegewald
[ Dieser Beitrag wurde am 20.02.2003 um 13:21 Uhr von Rene Hegewald editiert. ]
-
startinfo.cb = sizeof(TStartupInfo);
setmem(&startinfo,sizeof(TStartupInfo),0);Das bringt in dieser Reihenfolge wohl nichts
Ich hab das irgendwie net so ganz verstanden - du willst ein Programm starten, und falls dieses wieder andere Programme startet warten, bis all diese beendet wurden
-
Genau Flenders, genau soo soll es laufen,
das oben ist ein Beispiel das ich im Internet gefunden habe.
Da ich leider absolut Blutiger anfänger bin und von
Visual Basic auf C++ überlaufe (hat leider lang genug gedauert) weiss ich
mir da im moment absolut nicht zu helfen.
Die Docus sind in diesem Themen bereich nicht sehr hilfreich.PS: Schönes Wochenende
Heg.
-
da hatt ich mal was *such*
bool execute_and_wait(AnsiString ziel) { //Zuerst deklarieren wir die Strukturvariablen für die Übergabe an //die API-Funktion: TProcessInformation prozessinfo; TStartupInfo startinfo; //Dann deklarieren wir die "Größe" der Strukturen im Speicher: startinfo.cb = sizeof(TStartupInfo); setmem(&startinfo,sizeof(TStartupInfo),0); //Mit CreateProcess starten wir die Anwendung, um später über die TPoint //Struktur PROZESSINFO das Bestehen abfragen zu können if(CreateProcess(NULL,ziel.c_str(),NULL,NULL,false, CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS,NULL, NULL,&startinfo,&prozessinfo)==TRUE) { //Speicher freigeben CloseHandle(prozessinfo.hThread); //Warteschleife, die PROZESSINFO abfragt while(WaitForSingleObject(prozessinfo.hProcess, 100) == WAIT_TIMEOUT) Application->ProcessMessages(); //hier angekommen ist das Programm durch den Benutzer beendet worden ShowMessage(ziel + " geschlossen!"); //Speicher freigeben CloseHandle(prozessinfo.hProcess); } return true; }
*edit*
Huch das ist ja ziemlich dasselbe wie obenbenutz mal Codetags *schuldabweis*
Aber dann versteh ich dein Problem nicht, da genau das gemacht wird....DAs Application->ProcessMessages(); stört dich jetzt sicher noch da das Programm trotzdem weiter ausgeführt wird...
also nimm es raus und ersetz
while(WaitForSingleObject(prozessinfo.hProcess, 100) == WAIT_TIMEOUT) Application->ProcessMessages();
durch
while(WaitForSingleObject(prozessinfo.hProcess, 100) == WAIT_TIMEOUT);
[ Dieser Beitrag wurde am 21.02.2003 um 08:12 Uhr von dreaddy editiert. ]
-
Deine untere while Schleife ist aber nich mehr so ganz korrekt
Ich wür das eher so machen:
EnableWindow(hWnd, FALSE); WaitForSingleObject(prozessinfo.hProcess,INFINITE); EnableWindow(hWnd, TRUE);
Aber sein Problem ist, dass wenn er z.B. ein Programm aufruft, das wiederum ein anderes startet (z.B. den Notepad) und jetzt das erste Programm geschlossen wird sein Programm weiterläuft. Soll es aber noch nicht, sondern erst, wenn auch Notepad wieder geschlossen wurde. Vielleicht würden dir da Hooks helfen, oder SnapShots
-
Hat denn immernoch keiner eine Lösung ?? *snief*
-
#include <windows.h> #include <tlhelp32.h> #include <stdio.h> HANDLE hSnapShot = NULL; hSnapShot=CreateToolhelp32Snapshot (TH32CS_SNAPALL,NULL); PROCESSENTRY32 pEntry; pEntry.dwSize =sizeof(pEntry); //Buffer for Process Info char szProcessInfo[255]; //Get first process Process32First (hSnapShot,&pEntry); //Iterate thru all processes while(1) { BOOL hRes=Process32Next (hSnapShot,&pEntry); if(hRes==FALSE) break; printf("ID %d ",pEntry.th32ProcessID ); printf("ExeFile %s ",pEntry.szExeFile); printf("Threads %d ", pEntry.cntThreads ); printf("ParentID %d ",pEntry.th32ParentProcessID); printf("Prio %d\n",pEntry.pcPriClassBase ); }
So hier ein kleiner Teil der Lösung, jetzt nur noch die PID merken, von dem Prozess den ich starte und dann auf ParentID vergleichen ... und dann hab ich es *jubel*
[ Dieser Beitrag wurde am 25.02.2003 um 08:30 Uhr von Rene Hegewald editiert. ]
-
Wird da nicht der erste Eintag übersprungen? Ich würde es so machen:
//Get first process Process32First (hSnapShot,&pEntry); //Iterate thru all processes do { printf("ID %d ",pEntry.th32ProcessID ); printf("ExeFile %s ",pEntry.szExeFile); printf("Threads %d ", pEntry.cntThreads ); printf("ParentID %d ",pEntry.th32ParentProcessID); printf("Prio %d\n",pEntry.pcPriClassBase ); } while ( Process32Next(hSnapShot,&pEntry) );
Ist nicht getestet
-
Hast recht flenders, mein geistiger fehler :-)) ....
Heg