ShellExecute soll warten...
-
Hi,
ich habe ein Programm geschrieben dass mit Hilfe von FOP alle XML-Dateien in einem gegebenen Ordner in PDF Dateien umwandelt.
Ich rufe FOP über ShellExecute auf.
Schön und gut.
Allerdings soll das Programm bei jeder Datei solange warten bis das Programm durchgelaufen ist.
Er öffnet dieses allerdings nur und macht sofort fröhlich weiter.Das hat dann zur Folge dass ich nachher zig Dos-Boxen gleichzeitig offen habe, was ja nich sein soll.
Gibt es eine Möglichkeit das zu realisieren, dass mein Programm auf ShellExecute wartet?
Danke im Voraus
cu Errraddicator
Hier mein Code:
// search the xml-files SET_STATUS("Suche XML-Dateien..."); AnsiString searchParameter = sourceDirectory + "\\*.xml"; TSearchRec searchResults; int searchAttributes = faAnyFile; if(FindFirst(searchParameter, searchAttributes, searchResults) == 0) { do { // build the needed command AnsiString sourceFileName = searchResults.Name; AnsiString targetFileName = AnsiReplaceStr(sourceFileName, ".xml", ".pdf"); AnsiString parserParameter = " -xml " + sourceFileName + " -xsl " + stylesheet + " -pdf " + targetFileName; // create the pdf-file for the current xml-file SET_STATUS("Verarbeite Datei " + sourceFileName + "..."); runExternalApplication(parserApplication.c_str(), parserParameter.c_str() ); } while(FindNext(searchResults) == 0); } FindClose(searchResults);
-
Benutz CreateProcess statt ShellExecute, da kannst du ein Prozesshandle bekommen, auf das du warten kannst.
-
Ich denke, das ist dann eher ein Fall für CreateProcess...
-
Hallo
dazu brauchst du ShellExecuteEx() und WaitForSingleObject().
Schau mal im WinAPI-Forum nach.bis bald
akari
-
ich habe dazu in der FAQ jetzt dieses Beispiel gefunden:
(das hier ist nur der Aufruf)
// im Header ... HANDLE hNote; // im CPP on Button hNote = ExecuteProcess( "notepad", GetCurrentDir() ); notetimer->Enabled = true; // im on notetimer if ( hNote ){ DWORD noteExitCode; if ( GetExitCodeProcess(hNote , ¬eExitCode) ) { if ( noteExitCode== STILL_ACTIVE ) { // immer noch an } else { // Programm beendet notetimer->Enabled = false; CloseHandle( hNote ); } }
aber müsste da nich normalerweise ne while-schleife oder sowas sein?
oder wartet der bei CreateProcess von alleine?
-
Ich habs jetzt so gemacht und so funktionierts
HANDLE handle = executeProcess(command, targetDirectory); // wait for application to get finished DWORD exitCode; do { // give the process 100 milliseconds time Sleep(100); // check if process is still active GetExitCodeProcess(handle , &exitCode); } while(exitCode == STILL_ACTIVE); // close process-handle CloseHandle(handle);
-
Wozu die Schleife? Warum wartest du nicht einfach mit WaitForSingleObject?
-
MFK schrieb:
Wozu die Schleife? Warum wartest du nicht einfach mit WaitForSingleObject?
Weil ich bis gerade noch gar nich wusste das es sowas gibt
Jetzt habe ich die Schleife durch
// wait until the process has been completed WaitForSingleObject(handle, INFINITE);
ersetzt und das funktioniert auch.
Danke für den Tipp