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 oben 😃 benutz 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


Anmelden zum Antworten