IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

utilisation api shell pour lancer un programme en passant des paramètres


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 17
    Par défaut utilisation api shell pour lancer un programme en passant des paramètres
    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 :
    //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);
    }
    Si je lance la commande en passant des paramètres le jeu ne se lance pas, pas de message d’erreur :
    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);
    }
    Le résultat est le même avec la classe ProcessBuilder.

    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
    " +set fs_game nq + exec config.cfg +exec server.cfg";
    sans doute à cause des symboles « plus »

    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 :
    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);
    }
    Le jeu se lance sans problème.

    Si je code avec passage de paramètres :
    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 les messages d’erreurs suivants :
    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)
    J’ai par ailleurs en ligne de commande tapé manuellement la commande :
    "C:\Program Files\Wolfenstein - Enemy Territory\et.exe" +set fs_game nq + exec config.cfg +exec server.cfg
    Et le programme se lance bien avec les bons paramètres.

    J’ajoute que si je crée un fichier lance.cmd dans lequel j’écris
    "C:\Program Files\Wolfenstein - Enemy Territory\et.exe" +set fs_game nq + exec config.cfg +exec server.cfg
    Et que je lance le fichier lance.cmd avec
    try{sh.command(chemin).consume();}//lance la commande
    Cela fonctionne.
    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!

  2. #2
    Membre averti
    Inscrit en
    Octobre 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 17
    Par défaut
    Comme cela cela focntionne parfaitement :

    Shell sh = new Shell();//Construit un nouveau Shell en utilisant le shell systeme.
    File dir= new File("C:\\Program Files\\Wolfenstein - Enemy Territory");//An abstract representation of file and directory pathnames.
    sh.setDirectory(dir);//Modifie le répertoire à partir duquel les commandes du shell seront lancés.
    String chemin1 = "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 chemin1 avec passage des paramètres dans chemin2
    catch (IOException es) {
    //message en cas d'erreur
    JOptionPane.showMessageDialog(null,es,"Erreur",JOptionPane.ERROR_MESSAGE);
    }
    Mon erreur venait peut-être du fait qu'après avoir déterminé le répertoire à partir duquel les commandes du shell seront lancés avec
    sh.setDirectory(dir);//Modifie le répertoire à partir duquel les commandes du shell seront lancés.
    J'ai quand même indiqué le chemin complet de l'application. Cela faisait redondance et cela coinçait quelquepart.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Peut-on utiliser le cron pour lancer un programme Java ?
    Par _LittleFlea_ dans le forum Général Java
    Réponses: 4
    Dernier message: 29/04/2010, 12h13
  2. Raccourci pour lancer un programme
    Par BBert dans le forum AS/400
    Réponses: 6
    Dernier message: 22/07/2008, 16h31
  3. Utiliser le shell python dans ses programmes ?
    Par kedare dans le forum Général Python
    Réponses: 6
    Dernier message: 21/05/2008, 20h25
  4. Réponses: 7
    Dernier message: 20/06/2007, 11h31
  5. Réponses: 2
    Dernier message: 27/12/2005, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo