FraFu: gestarteten Prozess überwachen

Hallo!

Ich möchte von einem Java Applet aus eine Datei mit dem zugehörigem
Programm ausführen. Dazu hab ich folgendes Versucht:

Process p;
Runtime rt=Runtime.getRuntime();
p=rt.exec("cmd.exe start c:\temp\test.pdf");
jetzt wird noch ein Thread gestartet, der p überwacht und beim Beenden
des Prozesses etwas ausführen soll.

Das sollte die PDF Datei mit dem Acrobat Reader (oder was auch immer
mit diesem Dateityp verknüpft ist) öffnen.
Das Problem ist aber, dass im Taskmanager die cmd.exe zwar auftaucht,
aber nicht in der Taskleiste und das Fenster verborgen bleibt.

Ich hab auch folgendes versucht:
p=rt.exec("rundll32 SHELL32.DLL,ShellExec_RunDLL c:\temp\test.pdf");

Das funktioniert insofern, dass der Acrobat Reader aufgeht, aber der
Process p liefert sofort zurück, dass er beendet ist.
Ich muss den Process aber überwachen.

Anmerkungen:
Mein Programm braucht nur unter Windows zu laufen und auch da nur in
einem Intranet.

Was mache ich hier falsch? Irgendwelche Tips?

mfg
 Frafu

  1. Hallo,

    Ich möchte von einem Java Applet aus eine Datei mit dem zugehörigem
    Programm ausführen. Dazu hab ich folgendes Versucht:

    Process p;
    Runtime rt=Runtime.getRuntime();
    p=rt.exec("cmd.exe start c:\temp\test.pdf");

    Hm,

    p=rt.exec("cmd.exe /C "start c:\temp\test.pdf"");

    jetzt wird noch ein Thread gestartet, der p überwacht und beim Beenden
    des Prozesses etwas ausführen soll.

    Das sollte die PDF Datei mit dem Acrobat Reader (oder was auch immer
    mit diesem Dateityp verknüpft ist) öffnen.
    Das Problem ist aber, dass im Taskmanager die cmd.exe zwar auftaucht,
    aber nicht in der Taskleiste und das Fenster verborgen bleibt.

    Nein. Der Reader wird erst gar nicht gestartet. Zu den Parametern von CMD siehe:

    C:> help cmd

    Ich hab auch folgendes versucht:
    p=rt.exec("rundll32 SHELL32.DLL,ShellExec_RunDLL c:\temp\test.pdf");

    Das funktioniert insofern, dass der Acrobat Reader aufgeht, aber der
    Process p liefert sofort zurück, dass er beendet ist.

    Richtig, der Prozess zum Starten des Readers ist ja auch beendet. Der Readerprozess selbst ist ein Prozess des Systems, außerhalb der JVM.

    Ich muss den Process aber überwachen.

    Dann brauchtest Du so etwas wie DDE http://de.wikipedia.org/wiki/Dynamic_Data_Exchange. Suche nach "DDE Acrobat Reader". Oder Du musst eben das PDF-File mit Java-Mitteln bearbeiten http://www.google.de/search?hl=en&q=java+PDF.

    viele Grüße

    Axel

    1. Nein. Der Reader wird erst gar nicht gestartet. Zu den Parametern von CMD siehe:

      C:> help cmd

      Werd ich machen. Danke.

      Ich muss den Process aber überwachen.
      Dann brauchtest Du so etwas wie DDE http://de.wikipedia.org/wiki/Dynamic_Data_Exchange. Suche nach "DDE Acrobat Reader". Oder Du musst eben das PDF-File mit Java-Mitteln bearbeiten http://www.google.de/search?hl=en&q=java+PDF.

      PDF war hier nur ein Beispiel. Es soll das jeweilige Programm geöffnet werden, dass mit dem Dokumententyp verknüpft ist.

      mfg
        frafu

      1. Hallo,

        PDF war hier nur ein Beispiel. Es soll das jeweilige Programm geöffnet werden, dass mit dem Dokumententyp verknüpft ist.

        Naja "das jeweilige Programm öffnen, das (welches) mit dem Dokumententyp verknüpft ist" ist ja einfach. Die Kontrolle ist das Problem.

        Das hier http://www.softhema.de/jpa/index_ger.html liest sich erst mal gut.

        viele Grüße

        Axel

      2. PDF war hier nur ein Beispiel. Es soll das jeweilige Programm geöffnet werden, dass mit dem Dokumententyp verknüpft ist.

        Das hättest du früher schreiben sollen - dann hätte ich mir einen unsinnigen Beitrag gespart ;)

        Was dir aber helfen könnte: "start /wait"

        1. Das hättest du früher schreiben sollen - dann hätte ich mir einen unsinnigen Beitrag gespart ;)

          Sorry!

          Was dir aber helfen könnte: "start /wait"

          Das schaut von der Konsole aus als könnte man es brauchen. Allerdings bekomme ich eine IOException, wenn ich den Befehl aus Java heraus aufrufe:

          Mein Aufruf:
          p=rt.exec("start /wait c:\temp\test.pdf");
          Die Exception:
          java.io.IOException: CreateProcess: start /wait c:\temp\test.pdf error=2

          Jetzt würd mich halt noch interessieren, was Error# 2 ist.

          Wenn ich "start /wait c:\temp\test.pdf" in der Konsole aufrufe, funktioniert das. Dh. der Prompt wartet, bis der Acrobat Reader beendet ist.

          mfg
            frafu

          1. Hallo!»» »» Das hättest du früher schreiben sollen - dann hätte ich mir einen unsinnigen Beitrag gespart ;)

            Sorry!

            Was dir aber helfen könnte: "start /wait"

            Das schaut von der Konsole aus als könnte man es brauchen. Allerdings bekomme ich eine IOException, wenn ich den Befehl aus Java heraus aufrufe:

            Mein Aufruf:
            p=rt.exec("start /wait c:\temp\test.pdf");

            Jetzt hab ichs:
            cmd.exe /c start /wait c:\temp\test.pdf
            Damit funktionierts.

            Danke für die Hinweise!

            mfg
              frafu

  2. Hi.

    Ich hab auch folgendes versucht:
    p=rt.exec("rundll32 SHELL32.DLL,ShellExec_RunDLL c:\temp\test.pdf");

    Das funktioniert insofern, dass der Acrobat Reader aufgeht, aber der
    Process p liefert sofort zurück, dass er beendet ist.

    Das liegt daran, dass der Prozess nach dem Aufruf des Acrobat-Readers ja seine Schuldigkeit getan hat und sich verabschiedet.

    Die einfachste Lösung wäre, einfach das entsprechende Programm (Acrobat-Reader) unabhängig von der Konfiguration des Nutzers direkt zu starten. Die eventuell unterschiedlichen Pfade zur Acrobat-Programmdatei müssten sich über Umgebungsvariablen (Path?) clientseitig beheben lassen.

    Gruß
     Christoph