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 , &noteExitCode) ) {
          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 😉


Anmelden zum Antworten