mccae
Senfdazugeber
Hallo,
Dem kann ich leider nicht zustimmen.
Anscheinend gibt es hier ein Missverständnis was "ShellExecute" angeht.
C oder C++ sind nicht so böse wie ihr immer glaubt
ShellExecute liefert ein "HRESULT" welches sich in ein "INT_PTR" casten lässt und über Erfolg oder Misserfolg bescheid gibt.
Ein Wert > 32 steht für Erfolg, alle anderen Werte für einen ganz bestimmten Fehler.
Von diesen Fehlern gibt es einen ganzen Haufen, sei es ein OutOfMemory Error oder ein Fehler weil die ausführbare Datei gar keine ist! (was ja bei cmd.exe nicht rauszufinden ist).
Diesen int Wert caste ich wiederum in ein jint (die Version des Java Integers in C aus jni.h), gebe es zurück und interpretiere es dann auf der Java Seite wo dann entsprechende Exceptions geworfen werden.
Auch ein direktes Werfen von Java Exceptions von der C Seite aus ist möglich.
Ich verstehe nicht was da etwas zum Absturz bringen kann.
Wenn "ShellExecute" erfolgreich war, wirken sich spätere Programmfehler nicht auf die JVM aus da die Prozesse nicht gekoppelt sind.
Mit freundlichen Grüßen,
Martin C.
@mccae:
Der Vorteil der Variante mit cmd.exe ist, dass er bei Fehlern nur Exceptions wirft oder ggf. einfach nur nicht das ausführt, was du willst.
Die Variante über JNI kann bei Fehlern im C-Code (die werden ganz sicher in den Windows-DLLs auftreten) dein Programm zum Absturz bringt. Das ist also riskanter.
Dem kann ich leider nicht zustimmen.
Anscheinend gibt es hier ein Missverständnis was "ShellExecute" angeht.
C oder C++ sind nicht so böse wie ihr immer glaubt
ShellExecute liefert ein "HRESULT" welches sich in ein "INT_PTR" casten lässt und über Erfolg oder Misserfolg bescheid gibt.
Ein Wert > 32 steht für Erfolg, alle anderen Werte für einen ganz bestimmten Fehler.
Von diesen Fehlern gibt es einen ganzen Haufen, sei es ein OutOfMemory Error oder ein Fehler weil die ausführbare Datei gar keine ist! (was ja bei cmd.exe nicht rauszufinden ist).
Diesen int Wert caste ich wiederum in ein jint (die Version des Java Integers in C aus jni.h), gebe es zurück und interpretiere es dann auf der Java Seite wo dann entsprechende Exceptions geworfen werden.
Auch ein direktes Werfen von Java Exceptions von der C Seite aus ist möglich.
Ich verstehe nicht was da etwas zum Absturz bringen kann.
Wenn "ShellExecute" erfolgreich war, wirken sich spätere Programmfehler nicht auf die JVM aus da die Prozesse nicht gekoppelt sind.
Mit freundlichen Grüßen,
Martin C.
Zuletzt bearbeitet: