Interface en Java qui lance et communique avec un .exe ?

Signaler
Messages postés
17
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006
-
Messages postés
8
Date d'inscription
dimanche 26 février 2006
Statut
Membre
Dernière intervention
4 avril 2008
-
Bonjour,

je suis en train de faire évoluer un logiciel libre : Surface Evolver. C'est un logiciel appliqué à la chimie simulant des nano-surfaces, qui, une fois lancé, affiche une console MS DOS. On y rentre des commandes pour pouvoir afficher la fenetre de simulation ( fenetre graphique ), ou effectuer des operations sur la surface, entre autres.

Le but de mon travail est d'instaurer une interface qui rend l'utilisation de ce logiciel plus convivial.

Mes QUESTIONS sont :

- Peut-on lancer de JAVA un exécutable ( donc ce logiciel ), et peut-on en intercepter les fenetres pour intégrer (par exemple) la fenetre graphique dans l'interface et pour demander à ce que la console ne soit pas visible ?

- Si oui, comment faire ? ( J'ai essayé avec runtime et exec, ca me met aucune erreur mais ca ne me lance pas le programme).

- Et enfin, peut-on communiquer avec le programme lancé pour que ce soit l'interface qui donne les commandes à la console, et non plus l'utilisateur ?

Je vous remercie infiniement pour vos réponses.

PS : le langage source du logiciel est le C. Si je veux utiliser des fonctions du programme existant, il faudrait que j'utilise la JNI. C'est pourquoi j'essaye de trouver une solution alternative pour éviter de reprendre le code.

32 réponses

Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Salut,





peux tu faire un dernier test et ajouter 2-3 truc et exec ton appli avec



Exec ex = new Exec("rundll32 SHELL32.DLL,ShellExec_RunDLL evolver.exe Cat_plein_asym");



comme ca tu auras une visu de ce qu'il se passe dans la fenetre :P

WORA
Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Et je me suis rendu compte d'une erreur de copié collé dans la classe Exec



remplace



public Exec(String cmd) {

Runtime run = Runtime.getRuntime();

Process process = null;

//Lance le programme

try {

process = run.exec(cmd);

stdOut = process.getInputStream();

stdIn = process.getOutputStream();

} catch (IOException ioe) {

ioe.printStackTrace();

}

}


par



public Exec(String cmd) {

Runtime run = Runtime.getRuntime();

//Lance le programme

try {

process = run.exec(cmd);

stdOut = process.getInputStream();

stdIn = process.getOutputStream();

} catch (IOException ioe) {

ioe.printStackTrace();

}

}



j'avais oublié de supprimer

Process process = null;






WORA
Messages postés
17
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

Merci.

Avec ce que tu m'as dit de rajouter dans exec, la console s'affiche
enfin.. Par contre il n'y a toujours rien dans stdout ( il affiche null
), alors que la console affiche tous les caractères qu'il doit y avoir.
De plus l'envoi sur stdin de "s\n" n'a aucun effet sur la console..
Alors que ça m'affiche toujours true..



Mais déjà un progrès : il lance l'application et m'affiche la console..



Ce que j'aimerai maintenant, c'est pouvoir communiquer avec cette console.

Tu as peut-être une idée à ce que je doit rajouter.. ( Je me demande si
ça vient pas du fait qu'il faille attendre que l'appli se lance - parce
que java affiche "null true null", et ensuite la console s'affiche.. )



Merci beaucoup en tous les cas.
Messages postés
17
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

J'ai essayé de mettre un timer avant les opérations de lecture et
écriture ( pour laisser le temps à l'appli de bien se lancer ), et
apparait ce probleme :



- Quand je mets en commentaire l'opération
d'écriture, et que je laisse les 2 opérations de lecture, tout se passe
comme il faut : le programme se lance, le timer fait son décompte, et à
la fin du décompte java m'affiche 2 null. OK.



- Quand je remet l'écriture, il lance le programme,
fait le décompte, mais au moment d'écrire, il me dit ça : "le canal de
communication est sur le point d'être fermé"...



Si je mets pas de timer, il arrive à écrire ( puisqu'il m'affiche true
) mais sans effet sur l'appli. Et quand je mets un timer juste avant,
il ne fait plus l'écriture ( et m'écrit false ).



Comprends-tu qqchose ?



Merci.
Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Salut,





normalement tu n'as pas besoin de timer ou thread pour attendre pour
que ton appli prenne en compte tes instruction ou tes read bref ....



tu dis que tu as ce message : "le canal de communication est sur le point d'être fermé"

qui te le dis l'application java ou l'autre applicatiuon????? c'est un comportement normal de l'application ou non??





tu dis aussi que qd tu met le timer et que tu ecris il te retourne false



peux tu stp rajouter le code ci dessous dans l'objet Exec et afficher
son retour apres l'ecriture (je pense que le commentaire de sun sur la
methode est assez explicite)



/**

* causes the current thread to wait, if necessary, until the

* process represented by this
Process
object has

* terminated. This method returns

* immediately if the subprocess has already terminated. If the

* subprocess has not yet terminated, the calling thread will be

* blocked until the subprocess exits.

*

* @return the exit value of the process. By convention,


*
0
indicates normal termination.

* @exception InterruptedException if the current thread is


*
{@link Thread#interrupt() interrupted} by another thread


*
while it is waiting, then the wait is ended and an


*
{@link InterruptedException} is thrown.

*/

public int waitFor(){

try {

return process.waitFor();

} catch (InterruptedException e) {

e.printStackTrace();

return -1;

}

}


l'application bloque sur ce code ou t'affiche dirrectement un truc?



peux tu aussi afficher le code ci-dessous(à ajouter dans l'objet Exec) il te retourne une exception ou une valeur?



/**

* Returns the exit value for the subprocess.

*

* @return the exit value of the subprocess represented by this


*
Process
object. by convention, the value


*
0
indicates normal termination.

* @exception IllegalThreadStateException if the subprocess represented


*
by this
Process
object has not yet terminated.

*/

public int exitValue(){

return process.exitValue();

}




WORA
Messages postés
17
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

C'est Java qui me dit que le canal de communication est sur le point d'être fermé.



Quand j'utilise exitValue(), il me renvoie ca :



java.lang.IllegalThreadStateException: process has not exited



Et quand j'utilise waitFor(), il me renvoie 0, mais me met toujours cette phrase : le canal de communication ...
Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Salut,





c'est louche ton histoire.....



mais a quel moment la jvm te pond cette phrase qui na pas de sens?
verifie bien stp que c'est pas un print que tu aurais fais dans ton code

WORA
Messages postés
17
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

Ce n'est pas moi qui est mis ce print dans mon code, c'est sur...

Quand j'essaye d'écrire à l'application, voilà ce qu'il s'écrit dans la console java :





java.io.IOException: Le canal de communication est sur le point d'être fermé

at java.io.FileOutputStream.writeBytes(Native Method)

at java.io.FileOutputStream.write(FileOutputStream.java:260)

at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:66)

at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:124)

at Interface.Exec.write(Exec.java:60)

at Interface.Exec.writeln(Exec.java:69)

at Interface.SEFrame.(SEFrame.java:93)

at Interface.SEFrame.main(SEFrame.java:140





Je ne sais pas du tout d'où vient cette phrase : peut-etre de l'appli que j'ai lancé ? En tout cas, c'est bizarre..
Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Il est simplement impossible que la jvm renvoit un code d'exception
en français, il faut que tu trouve d'ou vient ce texte c'est tres
important parceque la il masque totalement le vrai message d'erreur
(cherche du coté de throw new XXXXException("Le canal de communication est sur le point d'être fermé");



WORA
Messages postés
17
Date d'inscription
jeudi 6 avril 2006
Statut
Membre
Dernière intervention
18 avril 2006

Dans mon programme, j'ai 6 classes, et je te jure qu'il n'y a pas ce type de message...

Je ne comprend pas. J'imagine que ce n'est pas un message des classes prédefinies, donc je ne vois pas du tout..



Impossible de te dire d'où vient ce message, je ne l'ai jamais écrit
dans mes classes. C'est certain. Si tu veux, je fais un copier-coller
de toutes mes classes et tu pourras le constater de toi-même..



N'est-il pas possible que ce soit l'application que je lance qui renvoie ça ?
Messages postés
5351
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
17 août 2020
97
Bof ba tu sais dans la vie tout est possible meme qu'un jour completement fatigué (ou bourré :D) tu as tapé ce texte

WORA
Messages postés
8
Date d'inscription
dimanche 26 février 2006
Statut
Membre
Dernière intervention
4 avril 2008

meme probleme pour moi
je veux juste afficher la fenetre du dos dans un cadre et je n'arrive pas
la commande exec execute regedit et calc mais pour dos (cmd) execution sans affichage