从Java应用程序执行任何.exe文件

从Java应用程序执行任何.exe文件,java,development-environment,exe,Java,Development Environment,Exe,我有一个Java应用程序,用户可以在其中提供任何可执行文件(.exe),应用程序将在系统上运行它。如cmd.exe、notepad.exe或unix a.out等 现在,我在阅读了大量示例后编写的代码似乎对用户创建的文件notepad.exe不起作用,但使用TC++编写的文件和所有文件都不起作用。有人能指出错误的原因吗 import java.io.*; class NewThread implements Runnable{ Thread t; NewThread(){

我有一个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");
        }
    }
…OK…不工作意味着当我使用Eclipse->Child thread exits运行它时[所有system.out消息都打印在控制台上,但要由.exe打印的消息都不会运行。AA.exe完全不运行。其他一些要点:

  • 它正常运行,没有抛出异常,唯一的问题是 AA.exe在任何地方都不可见
  • 它为流程p打印退出代码7…有任何线索吗
  • 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;
    }
    
    #包括
    #包括
    #包括
    #包括
    内部主(空)
    {
    int i,j;
    对于(j=0;j使用

    示例代码:

     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();
    
    ProcessBuilder pb=newprocessbuilder(“myCommand”、“myArg1”、“myArg2”);
    Map env=pb.environment();
    环境看跌期权(“VAR1”、“myValue”);
    环境移除(“其他变量”);
    环境put(“VAR2”,环境get(“VAR1”)+“后缀”);
    目录(新文件(“myDir”);
    进程p=pb.start();
    
    改用

    示例代码:

     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();
    
    ProcessBuilder pb=newprocessbuilder(“myCommand”、“myArg1”、“myArg2”);
    Map env=pb.environment();
    环境看跌期权(“VAR1”、“myValue”);
    环境移除(“其他变量”);
    环境put(“VAR2”,环境get(“VAR1”)+“后缀”);
    目录(新文件(“myDir”);
    进程p=pb.start();
    
    错误说明了什么

    路径环境很可能是错误的,并且它找不到它的依赖项(就像它需要启动的其他DLL一样)。有时进程会使用不同的机制来找出它们的路径或环境需要是什么

    如果你只是看到“error”,那么也许你可以打印出“e”的值,它也将包含你的异常。你还应该打印出错误流,你没有这样做,因为它可能包含重要的线索。

    错误说明了什么

    路径环境很可能是错误的,并且它找不到它的依赖项(就像它需要启动的其他DLL一样)。有时进程会使用不同的机制来找出它们的路径或环境需要是什么


    如果你只是看到“error”,那么也许你可以打印出“e”的值,它也会包含你的异常。你还应该打印出错误流,你没有这样做,因为这可能包含重要的线索。

    我想我已经得到了答案……问题不在于Java文件的源代码……我了解到Turbo C编译器我用来编译AA.C的er生成了一个16位的.exe文件(我还不知道它是什么意思)…但是我们的.getRuntime.exec()函数在正常模式下需要一个32位或更高的.exe,这是程序意外行为的原因

    这是我在Eclipse之外运行它时遇到的错误:

    当我尝试执行使用Visual Studio 2005开发的.exe时…我能够从应用程序启动该exe。
    感谢大家,但还有一个问题仍然存在,那就是如何运行16位exe文件。

    我想我已经找到了答案…问题不在于Java文件的源代码…我了解到我用来编译AA.C的Turbo C编译器生成了一个16位的.exe文件(我还不知道它的意思)…但是我们的.getRuntime.exec()函数要求在正常模式下使用32位或更高的.exe,这是程序意外行为的原因

    这是我在Eclipse之外运行它时遇到的错误:

    当我尝试执行使用Visual Studio 2005开发的.exe时…我能够从应用程序启动该exe。
    感谢大家,但还有一个问题,即如何运行16位exe文件。

    第一:定义“不工作”:它如何不工作。第二:至少使用
    e.printStackTrace()打印
    catch
    -块中的stacktrace
    .Third:阅读。你得到了什么输出?你必须阅读输出,以防止它阻塞,并可能试图告诉你你忽略了一个erorr表。另外,不要忽略异常最好打印出来。@Joachim@Peter:Point注意到了异常…:)我首先编辑了问题:定义“不起作用”:它是如何工作的。第二:至少使用
    e.printStackTrace()在
    catch
    -块中打印stacktrace
    .Third:阅读。你得到了什么输出?你必须阅读输出,以防止它阻塞,并可能试图告诉你你忽略了一个erorr表。另外,不要忽略异常最好打印出来。@Joachim@Peter:Point noted about exception.:)我编辑了这个问题,它不会是%PATH%。他使用的是一个绝对路径名命令。没有错误…它运行平稳,甚至可以完美地调用notepad.exe、msword.exe。问题只在于我创建的文件…(从命令提示符或双击调用时会完美执行)不会是%PATH%。他正在为命令使用绝对路径名。没有错误…它运行平稳,甚至可以完美地调用notepad.exe、msword.exe。问题只在于我创建的文件…(从命令提示符或双击调用时,会完美地执行)