2009-12-11 8 views
1

J'essaie de lancer mon c/c++ .exe depuis l'eclipse RCP (Java API).Impossible d'exécuter c/C++ exe à partir d'eclipse RCP

code:

package com.jkt.rcp.texteditor.handlers; 

import java.io.IOException; 

import org.eclipse.core.commands.AbstractHandler; 
import org.eclipse.core.commands.ExecutionEvent; 
import org.eclipse.core.commands.ExecutionException; 

//import com.jkt.runner.utils.Test; 

public class RecordHandler extends AbstractHandler { 

    private RecordingThread recordingThread; 
    @Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 
     System.out.println("inside RecordHandler..."); 

     recordingThread = new RecordingThread(); 

     recordingThread.start(); 

     return null; 
    } 



} 

et le code de RecordingThread.java est:

package com.jkt.rcp.texteditor.handlers; 

import java.io.IOException; 


public class RecordingThread extends Thread { 
    private String file = "C:\\workspace\\JProAcceptanceBot\\Record.exe"; 

    public void run() { 
     System.out.println("inside Run()..."); 

     try { 
     Process proc = Runtime.getRuntime().exec(file); 


     } catch (IOException e) { 
      System.out.println("IOException:"+e); 
      e.printStackTrace(); 
     } 

    } 
} 

En fait, après avoir cliqué sur RecordHandler.java exécute un bouton éclipse RCP.
Mais dès que je clique sur le bouton, c/c++ exe ne répond pas et mon programme Java cesse de répondre.
Sinon, si je lance ce exe à l'intérieur de mon éclipse, cela fonctionne bien.

Cette c/c++ exe a été faite en utilisant Eclipse CDT et Cygwin.

S'il vous plaît jeter un oeil dans le code et suggérer?

Répondre

0

Soyez conscient de Sun bug 6468220 (également décrit dans bug 6550942 et bug 6511002):

Sur la plateforme Windows Runtime.exec (String [] cmdarray) ne passe pas commander correctement les arguments de ligne, si l'un d'entre eux contient des guillemets doubles (» .)

Passing/Expected   --> Actual 

{ "ab\"c", "d\"ef" }  --> { "abc def" } 
{ "a b \" c", "d \" e f" } --> { "a b ", "c d", "e f " } 
{ "a", "", "b" }   --> { "a", "b" } 
{ "\" a" }     -->  java.lang.IllegalArgumentException 

donc, ma question est la suivante: quelle est la ligne de commande exacte que vous essayez d'exécuter

1

Je ne sais pas, mais vous pouvez commencer immédiatement la lecture InputStr? Eeam de proc obtenu par proc.GetInputStream(). In the documentation for Process:

toutes ses opérations io standard (stdin, stdout, stderr) seront redirigés vers le processus parent par trois flux (Process.getOutputStream(), Process.getInputStream(), Process.getErrorStream()). Le processus parent utilise ces flux pour alimenter en entrée et en sortie du sous-processus . Parce que certaines plates-formes natives ne fournissent qu'un tampon limitée taille pour l'entrée et la sortie standard flux, le défaut d'écrire rapidement le flux d'entrée ou lire le flux de sortie du sous-processus peut entraîner la sous-processus pour bloquer, et même impasse . Décrit le même problème et explique la solution (en page 3)

This article on javaworld décrit le même problème et explique la solution.

+0

J'avais essayé le truc mais pas de chance. En fait, mon code natif génère un fichier texte et écrit du matériel dans ce fichier texte. – Vishal

+0

Ce problème existe indépendamment de ce que fait le fichier .exe. Avez-vous regardé la sortie de proc.GetInputStream() dans un débogueur? –

+0

Thanx jilles.Le problème a été résolu avec votre suggestion.En fait, je faisais une mauvaise manipulation avec proc.GetInputStream(). Maintenant, mon c/C++ exe fonctionne bien à partir de RCP. – Vishal