exe nacheinander ausführen und auf Rückmeldung warten



  • Hallo,

    bin recht neu auf dem Gebiet der C++ Programmierung.

    Ich würde gerne mehrere Programme nacheinander starten, wobei immer auf die Rückmeldung des gerade ausgeführten Programmes gewartet wird.
    Das heisst wenn das eine Programme beendet wurde, soll das nächste starten ! Zum Beispiel die setup.exe von Adobe Reader und Firefox.

    Das starten der einzelnen Programme ist ja nicht das Problem. Wie bekomme ich das hin, das solange gewartet wird bis das eine beendet wurde.

    Momentan probiere ich mit CreateProcess eine Lösung hinzubekommen, nur werden die Programme immer paralell oder kurz nacheinander gestartet.

    Ich hoffe es ist einigermaßen verständlich !?

    Danke für eure Hilfe ...



  • CreateProcess ist ok, oder ShellExecute wäre eine andere Variante.
    Um zu warten bis der Prozess beendet wird benötigst Du WaitForSingleObject(..).
    Dabei musst Du das Handle des Prozesses angeben.

    Simon


  • Mod

    Nur als Hinweis:
    ShellExceute gibt kein Handle auf den Prozess zurück. Das geht nur mit ShellExecuteEx. Und hinterher CloseHandle nicht vergessen 😉



  • Hallo,

    bin gerade dabei weiter zu proggen, momentan sieht das so aus:

    **if(this->checkBox2->CheckState==CheckState::Checked)
    {
    wchar_t runit[] = L"install\\Nero\\setup.exe";

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( !CreateProcess( NULL,(LPWSTR)runit,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi ))
    {
    while(WaitForSingleObject(pi.hProcess, INFINITE ) != WAIT_TIMEOUT);
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    }
    }

    if(this->checkBox3->CheckState==CheckState::Checked)
    {
    wchar_t runit[] = L"install\\Burn4Free\\setup.exe";

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( !CreateProcess( NULL,(LPWSTR)runit,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi ))
    {
    while(WaitForSingleObject(pi.hProcess, INFINITE ) != WAIT_TIMEOUT) ;
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
    }
    }**

    Leider werden die beiden EXE immer kurz nacheinander ausgeführt ! Vielleicht ist da ja irgendwo ein Denkfehler bei mir.



  • Ich würde Dir raten das .NET Framework zu benutzen, wenn Du schon in C++/CLI programmierst:

    Dafür gibst die Klassen System::Diagnostics::Process.
    Sollte relativ selbsterklärend sein, ansonsten:
    http://msdn.microsoft.com/de-de/library/system.diagnostics.process.aspx
    Simon



  • CreateProcess liefert bei erfolgreichem Ausführen != 0 d.h. Dein IF Block und damit WaitFor wird nicht ausgeführt 😉

    Evtl. würde ich die

    while(WaitForSingleObject(pi.hProcess, INFINITE ) != WAIT_TIMEOUT);
    

    durch

    DWORD dwExitCode = 0;
    while(::GetExitCodeProcess( pi.hProcess, &dwExitCode) && dwExitCode == STILL_ACTIVE) Sleep(100);
    

    ersetzen.

    Gruß


  • Mod

    UserMarcus schrieb:

    CreateProcess liefert bei erfolgreichem Ausführen != 0 d.h. Dein IF Block und damit WaitFor wird nicht ausgeführt 😉

    Und warm sollte der nicht ausgeführt werden bei der Prüfung:

    if( !CreateProcess( NULL,(LPWSTR)runit,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi )) 
    {
    

    UserMarcus schrieb:

    Evtl. würde ich die

    while(WaitForSingleObject(pi.hProcess, INFINITE ) != WAIT_TIMEOUT);
    

    durch

    DWORD dwExitCode = 0;
    while(::GetExitCodeProcess( pi.hProcess, &dwExitCode) && dwExitCode == STILL_ACTIVE) Sleep(100);
    

    ersetzen.

    1. ist dieser Code

    while(WaitForSingleObject(pi.hProcess, INFINITE ) != WAIT_TIMEOUT);
    

    unsinnug. INFINITE heißt unbegrenzt warten. Es kann keine Rückgabe von WAIT_TIMEOUT geben.
    Es genügt also:

    WaitForSingleObject(pi.hProcess, INFINITE )
    

    2. Warum soll Dein Code besser sein? Dadurch wacht der Thread immer wieder auf, obwohl er das gar nicht müsste.



  • Martin Richter schrieb:

    UserMarcus schrieb:

    CreateProcess liefert bei erfolgreichem Ausführen != 0 d.h. Dein IF Block und damit WaitFor wird nicht ausgeführt 😉

    Und warm sollte der nicht ausgeführt werden bei der Prüfung:

    if( !CreateProcess( NULL,(LPWSTR)runit,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi )) 
    {
    

    Wegen dem '!' ?

    Martin Richter schrieb:

    1. ist dieser Code

    while(WaitForSingleObject(pi.hProcess, INFINITE ) != WAIT_TIMEOUT);
    

    unsinnug. INFINITE heißt unbegrenzt warten. Es kann keine Rückgabe von WAIT_TIMEOUT geben.
    Es genügt also:

    WaitForSingleObject(pi.hProcess, INFINITE )
    

    2. Warum soll Dein Code besser sein? Dadurch wacht der Thread immer wieder auf, obwohl er das gar nicht müsste.

    Hast Du wohl recht 😉 (War Gedanklich irgendwie bei einem Problem das ich hatte mit der Gültigkeit des Handles, aber dass ist ne andere Geschichte..)


  • Mod

    UserMarcus schrieb:

    Wegen dem '!' ?

    Peinlich! Du hast Recht. Sorry... CreateProcess liefert 0 bei Misserfolg.

    Das "!" muss weg!



  • Vielen Dank erstmal !!!

    Hat mir schonmal weitergeholfen, auf das ! hätte ich ja auch mal selber kommen können.

    Nun werden auch die Prozesse nacheinander abgearbeitet 🙂


Anmelden zum Antworten