Objet : utilisation api shell pour lancer un programme en passant des paramètres
Bonjour
Je travaille sur netbeans 711 sous Windows Seven
Je souhaite à partir d’une interface graphique proposer de lancer le jeu FPS freeware http://www.enemy-territory.fr/
Ce jeu peut être lancé en ligne de commande avec des paramètres intéressants pour le joueur mais qui sont compliqués à mettre en œuvre pour un utilisateur moyen. Cette interface pourrait lui simplifier le lancement du jeu.
Pour ce faire, j’ai lu la doc http://ydisanto.developpez.com/tutor.../runtime-exec/ et donc essayé la classe Runtime puis ProcessBuilder.
Dans les deux cas je suis obligé d’utiliser :
String[] args = { "cmd.exe", "/c", Chemin de l’appli avec ses paramètres };
Car le jeu sous Windows Seven a besoin d’être lancé en administrateur, et il semble que la seule manière d’y arriver est de passer par "cmd.exe".
Si je lance la commande sans passer de paramètres le jeu s’ouvre correctement :
Si je lance la commande en passant des paramètres le jeu ne se lance pas, pas de message d’erreur ://lancement du jeu enemy territoy
try {
String chemin = "\"C:\\Program Files\\Wolfenstein - Enemy Territory\\et.exe\"";
Process proc = Runtime.getRuntime().exec(new String[] {"cmd.exe", "/C", chemin});
} catch (IOException e) {
//message en cas d'erreur
JOptionPane.showMessageDialog(null,e,"Erreur",JOptionPane.ERROR_MESSAGE);
}
Le résultat est le même avec la classe ProcessBuilder.try {
String chemin1 = "\"C:\\Program Files\\Wolfenstein - Enemy Territory\\et.exe\"";
String chemin2 = " +set fs_game nq + exec config.cfg +exec server.cfg";
String chemin = chemin1+chemin2;
Process proc = Runtime.getRuntime().exec(new String[] {"cmd.exe", "/C", chemin});
} catch (IOException e) {
//message en cas d'erreur
JOptionPane.showMessageDialog(null,e,"Erreur",JOptionPane.ERROR_MESSAGE);
}
D’après ce que j’ai lu dans le forum les classes Runtime puis ProcessBuilder ne sont pas des interpréteurs de ligne de commande, et donc ne sauraient pas gérer des passages de paramètres de type
sans doute à cause des symboles « plus »" +set fs_game nq + exec config.cfg +exec server.cfg";
Il est donc conseillé d’utiliser l’api Shell de Franck Martini http://blog.developpez.com/index.php...&c=1&tb=1&pb=1
Soit. J’ai téléchargé l’api, et dans Netbeans j’ai procédé comme indiqué dans les forums et les tutos :
Si je code sans passage de paramètres :
Le jeu se lance sans problème.private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Shell sh = new Shell();//Construit un nouveau Shell en utilisant le shell systeme.
File dir= new File("C:\\Program Files\\Wolfenstein - Enemy Territory");
sh.setDirectory(dir);//Modifie le répertoire à partir duquel les commandes du shell seront lancés.
String chemin = "\"C:\\Program Files\\Wolfenstein - Enemy Territory\\et.exe\"";
JOptionPane.showMessageDialog(null,chemin,"Erreur",JOptionPane.ERROR_MESSAGE);
try{sh.command(chemin1).consume();}//lance la commande
catch (IOException es) {
//message en cas d'erreur
JOptionPane.showMessageDialog(null,es,"Erreur",JOptionPane.ERROR_MESSAGE);
}
Si je code avec passage de paramètres :
J’ai les messages d’erreurs suivants :private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Shell sh = new Shell();//Construit un nouveau Shell en utilisant le shell systeme.
File dir= new File("C:\\Program Files\\Wolfenstein - Enemy Territory");
sh.setDirectory(dir);//Modifie le répertoire à partir duquel les commandes du shell seront lancés.
String chemin1 = "\"C:\\Program Files\\Wolfenstein - Enemy Territory\\et.exe\"";
String chemin2 = " +set fs_game nq + exec config.cfg +exec server.cfg";
String chemin = chemin1+chemin2;
JOptionPane.showMessageDialog(null,chemin,"Erreur",JOptionPane.ERROR_MESSAGE);
try{sh.command(chemin).consume();}//lance la commande
catch (IOException es) {
//message en cas d'erreur
JOptionPane.showMessageDialog(null,es,"Erreur",JOptionPane.ERROR_MESSAGE);
}
J’ai par ailleurs en ligne de commande tapé manuellement la commande :run:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException
at java.lang.ProcessImpl.<init>(ProcessImpl.java:181)
at java.lang.ProcessImpl.start(ProcessImpl.java:133)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021)
at com.developpez.adiguba.shell.ProcessConsumer.getProcess(ProcessConsumer.java:471)
at com.developpez.adiguba.shell.ProcessConsumer.consume(ProcessConsumer.java:486)
at javaapplication2.NewApplication.jButton1ActionPerformed(NewApplication.java:220)
at javaapplication2.NewApplication.access$000(NewApplication.java:15)
at javaapplication2.NewApplication$1.actionPerformed(NewApplication.java:61)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Et le programme se lance bien avec les bons paramètres."C:\Program Files\Wolfenstein - Enemy Territory\et.exe" +set fs_game nq + exec config.cfg +exec server.cfg
J’ajoute que si je crée un fichier lance.cmd dans lequel j’écris
Et que je lance le fichier lance.cmd avec"C:\Program Files\Wolfenstein - Enemy Territory\et.exe" +set fs_game nq + exec config.cfg +exec server.cfg
Cela fonctionne.try{sh.command(chemin).consume();}//lance la commande
Mais ce n’est pas très élégant, et comme les paramètres peuvent être dynamiques je n’ai pas envie de gérer et modifier des fichiers batchs.
Merci de votre aide SVP!
Partager