Выполнение любого файла .exe из приложения Java - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть приложение Java, в котором пользователь может предоставить любой исполняемый файл (.exe), и приложение запустит его в системе.Как cmd.exe, notepad.exe или в unix a.out и т. Д.

Теперь код, который я написал после просмотра многочисленных примеров, просто не работает для файлов, созданных пользователем, notepad.exe работает нормально, нофайлы, написанные с использованием TC ++, и все не работают.Может кто-нибудь указать, что может быть причиной ошибки здесь?

 import java.io.*;

 class NewThread implements Runnable{
    Thread t;

    NewThread(){
        t = new Thread(this, "Demo Thread");
        System.out.println("child thread:" + t);
        t.start();      
    }

    public void run(){
        try
        {
        String line;    
        Process p = Runtime.getRuntime().exec("C:\\TC\\BIN\\AA.EXE");
        InputStream in = p.getInputStream();
        OutputStream out = p.getOutputStream();
        InputStream err = p.getErrorStream();
        BufferedReader br= new BufferedReader(new InputStreamReader(in));
        System.out.println("Chid running");
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
        //p.destroy();


                }
        catch (Exception e)
        {
            System.out.println("ERROR");

        }
        System.out.println("Child thread exiting");

}
}
    class ThreadDemo {
        public static void main (String args[]){
            new NewThread();
            try {
                for(int i=05;i>0;i--){
                    System.out.println("Main Thread:" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e){
                System.out.println("Main thread Interrupted");
            }
            System.out.println("Main thread exiting");
        }
    }

.... ОК ... не работает означает, что когда я запускаю его с помощью Eclipse-> дочерний поток выходит [всеСообщения system.out печатаются на консоли, но не те, которые должны быть напечатаны .exe AA.exe не запускается вообще.Некоторые другие пункты:

  1. Работает нормально, исключений не выдается, проблема только в том, что вывод AA.exe нигде не виден.
  2. Он печатает код выхода 7 дляпроцесс ... любой ключ ????
  3. notepad.exe или MSWord.exe и даже TC.exe работают совершенно нормально при вызове через этот код.

вот код для AA.exe:

  #include <stdlib.h>
#include <stdio.h>
#include <values.h>
#include <time.h>

int main(void)
{
   int i,j;

      for(j=0;j<150;j++)
      {
     // randomize();
      for(i=0;i<200;i++)
     printf("%d\n", rand() % MAXINT);
      }
   return 0;
}

Ответы [ 3 ]

2 голосов
/ 08 апреля 2011

Вместо этого используйте ProcessBuilder.

Код образца:

 ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
 Map<String, String> env = pb.environment();
 env.put("VAR1", "myValue");
 env.remove("OTHERVAR");
 env.put("VAR2", env.get("VAR1") + "suffix");
 pb.directory(new File("myDir"));
 Process p = pb.start();
1 голос
/ 09 апреля 2011

Я думаю, что получил ответ ... Проблема не в исходном коде файла Java ... Я узнал, что Turbo C Compiler, который я использовал для компиляции AA.C, генерирует 16-битный файл .exe(Я пока не знаю, что это значит) ... Но наша функция .getRuntime.exec () ожидает 32-разрядный или более поздний файл .exe в обычном режиме. Это стало причиной неожиданного поведения Программы.

Это ошибка, которую я получил, когда пытался запустить ее вне Eclipse:

image included

Когда я пытался запустить .exe, разработанный с использованием Visual Studio 2005 .... Я смогзапустить exe из приложения.Спасибо всем вам, но остается один вопрос: Как запустить 16-битный исполняемый файл.

0 голосов
/ 08 апреля 2011

Что говорит ошибка (ы)?

Вполне возможно, что среда PATH неправильная, и она не может найти свои зависимости (как и другие библиотеки DLL, которые нужно запустить). Иногда процессы используют разные механизмы, чтобы выяснить, каким должен быть их путь или среда.

Если вы видите только «ошибку», возможно, вы могли бы распечатать значение «е», которое также будет содержать ваше исключение. Вам также следует распечатать поток ошибок, который вы не делаете, поскольку он может содержать важные подсказки.

...