Exterens Programm aufrufen und abwarten bis dann beendet/fertig ist



  • Hallo Leute,
    ich möchte ein externes Programm aufrufen, dass mir im Hintergrund eine Datei erzeugt. Wenn die fertig erzeugt wurde, soll das Hauptprogramm diese Datei öffnen.

    Bisher habe ich es so programmiert:

    WinExec(sPfad, SW_HIDE);
    //Warten fuer die Konvertierung
    Sleep(4500);
    //dann wird Datei vom externen Programm geoeffnet
    

    Aber leider ist das Sleep etwas kritisch, falls das externe Programm schneller ist (da wartet man sinnlos) oder zu langsam (da gibts einen Konflikt beim Laden der gerade erzeugten Datei) als die bei Sleep angegeben Zeit.

    Gibt es eine Möglichkeit auf das Ende des externen Programms zu warten (ohne Sleep)?

    Würde mich sehr freuen, wenn ihr mir helfen könntet! Danke im voraus!



  • Du könntest dein Programm mit CreateProcess aufrufen (anstatt ShellExecute)

    Siehe:
    http://msdn.microsoft.com/en-us/library/ms682425.aspx

    Dort bekommst du ein Handle auf den Prozess zurück - auf dieses kannst du mit WaitForSingleObject warten

    http://msdn.microsoft.com/en-us/library/ms687032.aspx



  • Oder ShellExecuteEx

    Dort bekommst du ein Handle auf den Prozess - auf dieses kannst du mit WaitForSingleObject warten



  • Vielen Dank. Hab bloss noch ein Problem.
    Ich habe das ganze jetzt über CreateProcess und WaitForSingleObject gelöst. Leider funktioniert jetzt nicht mehr das wunderschöne Fensterverstecken wie mit SW_HIDE in der function WinExec. Irgendwie klappt es so nicht bei CreateProcess:

    STARTUPINFO         si;
    				PROCESS_INFORMATION pi;
    
    				ZeroMemory (&si, sizeof(si));
    				si.wShowWindow = SW_HIDE;
    				si.cb=sizeof (si);
    
    				LPSTR lpTest=  sTest.GetBuffer();
    				if (! CreateProcess(
    										NULL,				  // Nix - starten Programm ueber Kommandozeile
    										lpTest,               // Kommandozeile
    										0,                    // Prozesseinstellungen
    										0,                    // Threadeinstellungen
    										0,                    // inherit handles
    										CREATE_NEW_CONSOLE,   // Erzeugungs-Flags
    										0,                    // Umgebungsparameter
    										0,                    // bei Problemen nutz Prozess gleichen Pfad wie Hauptprogramm
    										&si,				  // Adresse von StartupInfo
    										&pi					  // Adresse von ProcessInfo
    									))
    				{
    					::MessageBox(0, "Fehler beim Konvertieren und Erstellen der Datei", 0, 0);
    				}
    				//Warten bis Konverter fertig -> aber nicht laenger als 10 Sekunden 
    				WaitForSingleObject(pi.hProcess,10000);
    

    Warum nicht?


  • Mod

    Weil Du STARTF_USESHOWWINDOW nicht gesetzt hast!



  • Oh, genau das hab ich vergessen. Vielen Dank!


Anmelden zum Antworten