Rondando um .exe numa classe

16 respostas
Luiz-SP

Então pessoal, estou tentando executar um programa dentro de um classe, esse executável recebe um parametro texto e um arquivo to fazendo assim

/*
 * Criado em 03/02/2005 para fins didáticos e 
 * porque programar é acima de tudo um prazer.
 * 
 */
package com.modalnetworks;

import java.lang.Runtime;
import java.io.*;
/**
 *  
 *  Por luiz Claudio França dos Santos, esta classe
 *  cria um processo para o uso do wxis
 */
public class WxisJava {
    
    private Runtime run;
    private Process proc;
    private String[] argumentos; 
  
    public WxisJava (File script){
        try {
         argumentos = new String[1];
         argumentos[0] = " IsisScript=";  //parametro texto      
         run = Runtime.getRuntime();  
         proc = run.exec("wxis",argumentos, script );
         proc.waitFor();
        }
        catch (IOException e){
           System.out.println(e.toString());
        }
        catch (InterruptedException e){}
    }
}

Aqui eu chamo a classe:

*
 * Criado em 03/02/2005 para fins didáticos e 
 * porque programar é acima de tudo um prazer.
 * 
 */
package com.modalnetworks;

import java.io.*;
/**
 *  
 *  Por luiz Claudio França dos Santos, esta classe
 *  declara o WxisJava
 * 
 */
public class HelloWorld {

    public static void main(String[] args) {
        File script = new File("C:\wxis\x.xis");
        WxisJava x = new WxisJava(script);
    }
}

Estou recebendo a seguinte mensagem de erro:

java.io.IOException: CreateProcess: wxis error=267

Minha estrutura de arquivos tá assim, dentro do eclipse:

wwwisis (java project)
   -com.modalnetworks (pacote)
       -Helloworld.class   (classe do pacote)
       -WxisJava.class    (classe do pacote)
   -wxis.exe   (O executável que eu quero rodar)

16 Respostas

keller

em seus blocos catch’s use assim:

try{
 um_codigo_perigoso;
}catch(IOException e){
 e.printStackTrace();
}

Se você nao conseguir descobrir cole o printStack aqui para nós tentarmos te ajudar…
valeu ? até mais… :wink:

Luiz-SP

fiz o que vc falou…

java.io.IOException: CreateProcess: wxis error=267
	at java.lang.ProcessImpl.create(Native Method)
	at java.lang.ProcessImpl.<init>(Unknown Source)
	at java.lang.ProcessImpl.start(Unknown Source)
	at java.lang.ProcessBuilder.start(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at com.modalnetworks.WxisJava.<init>(WxisJava.java:27)
	at com.modalnetworks.HelloWorld.main(HelloWorld.java:19)

não entendi o que aconteceu…parece que o argumento é inválido?

O que eu queria qeu isso fizesse é o equivalente a :

c:\wix IsisScript=wxis.x <enter>
Hello world

Note que o wix é um excutável que lê um script em forma de arquivo (wxis.x, no caso do exemplo acima) e tem um argumento (IsisScript=, tb no caso acima)

Alguém pode me ajudar :frowning: :frowning: :frowning:

Sami_Koivu

gui, java é mesmo tão perigoso assim? :-o

brincadeira, acho um ótimo conselho… pessoalmente nunca deixo os blocos catch sem printStackTrace. So tiro o printStackTrace quando tenho implementado codigo pra lidar com os erros.

Luiz:
Acho que você quer em vez de:

argumentos = new String[1];
         argumentos[0] = " IsisScript=";  //parametro texto      
         run = Runtime.getRuntime();  
         proc = run.exec("wxis",argumentos, script );
         proc.waitFor();

o seguinte:

run = Runtime.getRuntime();
         proc = run.exec("wxis IsisScript=" + script.getPath());
         proc.waitFor();

Dando uma olhada no javadocs:

E então o parametro envp não são argumentos para o comando, mas sim parametros environment, tipo PATH ou CLASSPATH. E o terceiro parametro também não é um argumento - é a pasta onde será executado o comando.

Meu português não é perfeito. Isso é um fato. Se não dá pra entender, me avisa, e vou tentar de novo. :slight_smile:

-Sami

Luiz-SP

Blz… fiz o que o Sami disse, na verdade eu já tinha feito isso antes, o problema é desse jeito, a saída no console (Hello world) não aprarece, acho que tenho de fazer algo para conseguir manipular essa saída, o problema é que eu não tenho a menor idéia de como fazer isso…Alguém sabe o que eu posso fazer? :?

Sami_Koivu

Ah, sim, você vai ter que pegar a saída com o metodo getOutputStream() do Process.

Infelizmente tenho que sair agora mesmo. Mais tarde te mando um exemplo se ainda for preciso.

-Sami

Sami_Koivu

Opaaaa… quero dizer o metodo getInputStream()

Fiz um exemplo que executa o comando ipconfig, pega a saída e mostra no console(System.out):

import java.io.*;
import java.util.*;

public class Exemplo {

  public static void main(String[] args) {
    try {
      Runtime run = Runtime.getRuntime();
      Process processo = run.exec("ipconfig");
      BufferedReader br = new BufferedReader(new InputStreamReader(processo.getInputStream()));
      while(true) {
        String line = br.readLine();
        if(line == null) break;

        System.out.println(line);
      }
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

-Sami

Luiz-SP

blz funcinou… :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:
Obrigado…
O que vc ta fazendo da Finlândia…Isso é muito longe!!!

Sami_Koivu

Blz. :slight_smile:

Com uma tempestade de inverno como temos hoje gostaria muito de não estar aqui na Finlândia, mas…

Sou finlandês… moro aqui… tô no GUJ tentando melhorar meu português. Aprendendo java no processo. O java é bem mais fácil do que o português :slight_smile:

-Sami

Luiz-SP

Seu português tá muito bom…Como vc começou aprender português? vc sabe que o português do Brasil é diferente do português de Portugal, então de vc tiver aprendendo português por causa de alguma portuguesa esse não é o melhor lugar praticar…Aí tá nevando…eu nunca vi neve, eu nunca experimentei uma temperatura menor que 8ºC, se eu puder te dar uma força no português…pode contar comigo…

Sami_Koivu

Muito obrigado.

Bom, eu morava em SP por uns 7 meses. Assim foi natural tentar aprender o idioma.

Certo, sei que existem diferenças. Fica chato porque temos livros em português aqui numa grande loja de livros… e tem obras de Paulo Coelho e Jorge Amado entre outras, mas são edições feitas para Portugal. Então o texto é português de Portugal. Como tenho lido muitos daqueles livros, fico confuso, sem saber o que de Portugal e o que do Brasil. :x

Mas o que tô interessado em é mesmo o português do Brasil.

Vi os filmes Cidade de Deus e Carandiru, escuto muito a música brasileira, tento ajudar as pessoas aqui com o que sei sobre java e espero que tô fazendo progresso com o português.

E valeu, você já tá dando uma força :slight_smile:

-Sami

fenrir

Rapaz…só um comentário: o seu português é absurdamente melhor que o de MUITO brasileiro nato!

S

E ai galera…blz
Vocês poderiam me explicar como funciona esse parte do código que vocês colocaram acima:

Runtime run = Runtime.getRuntime();
Process processo = run.exec("ipconfig");

[]s!!

Luiz-SP

sacchet…nem tem muito que explicar com o import

import java.lang.Runtime;

importei a classe Runtime, com essa classe eu consigo executar um comado para o SO,de dentro da minha classe por exemplo.
No caso que vc citou executo o comando ipconfig, então associo esse comando a um objeto Process através do método exec da classe Runtime, esse objeto Process se encarregará de executar o comando…até que tinha bastante coisa para explicar :slight_smile:

menina_cac

Olá a todos,

Estou tendo problemas para capturar o stream de saída do processo, tentei utilizar o exemplo do Sami e consegui.

String input = "g++ -o /home/teste.exe /home/teste.cpp";
            File exe = new File("/home/teste.exe");            
            (new File("/home/teste.obj")).delete();
            exe.delete();
            System.out.println("***Compiling...");
            compiler = Runtime.getRuntime().exec(input);
            //compiler.waitFor();
			
            String txt="";
            BufferedReader out = new BufferedReader(new InputStreamReader(compiler.getInputStream()));
            String line = "";        
            while ((line = out.readLine()) != null){
                System.out.println(line);
                txt = txt+line+"\n";
            }
            out.close();

A variável “txt” sempre vem vazia. Se eu executar o comando direto na shell ele funciona, aparece as mensagens de erros de compilação do arquivo teste.cpp. Outro detalhe: No Windows funciona mas no Linux não. Alguém tem alguma idéia?

Sami_Koivu

Olá,

Talvez, se são mensagens de erros eles estão direcionados à saída de erro. Se isso for o caso, é necessário ler o “error steam” também. Ou seja, faça a mesma coisa com compiler.getErrorStream() o que você já esta fazendo com compiler.getInputStream()

Quando você executa comandos direto na shell, ambos são mostrado no console e nem dá pra ver qual é.

Abraços,
Sami

menina_cac

Sami Koivu:
Olá,

Talvez, se são mensagens de erros eles estão direcionados à saída de erro. Se isso for o caso, é necessário ler o “error steam” também. Ou seja, faça a mesma coisa com compiler.getErrorStream() o que você já esta fazendo com compiler.getInputStream()

Quando você executa comandos direto na shell, ambos são mostrado no console e nem dá pra ver qual é.

Abraços,
Sami

Isso mesmo!! :smiley: Grande Sami! Funcionou.

Criado 10 de fevereiro de 2005
Ultima resposta 21 de jun. de 2005
Respostas 16
Participantes 6