有没有其他方法可以从Java运行.exe?

时间:2014-04-01 20:28:12

标签: java c++ gui-design

主要问题是我无法通过Java运行我的c ++逻辑; 我是否正确创建了子进程?

谢谢大家; ---更新! ---

所以我写了这些来测试以最纯粹的方式打开.exe的能力; Eclipse可以看到文件/没有抱怨它不存在;使用Eclipse中的运行按钮运行:

java文件:

import java.io.*;

public class Runs_A_Exe {
   public static void main( String[] args ){
      try {
         ProcessBuilder pb = new ProcessBuilder( "M:\\aaa\\bbb\\ccc\\ddd\\eee\\workspace\\Runs Simple Exe\\src\\executables\\a.exe" );
         Process p = pb.start();

         InputStream is = p.getInputStream();
         InputStreamReader isr = new InputStreamReader( is );
         BufferedReader br = new BufferedReader( isr );
         System.out.println( br.readLine() );
      }

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

c ++文件:

#include <iostream>

int main( void ) {
   std::cout << "Hey!" << std::endl;
}

输出:

  

2 个答案:

答案 0 :(得分:2)

您是否使用正确的参数调用它? C ++是否有正确的工作目录? Java是否正确解析了stdout?如果你只用C ++做一个hello world,你能用Java看到它吗?

我建议从头开始,使用最简单的C ++程序,慢慢地复杂化C ++(重新放入逻辑)

  • 首先从java调用hello world,并确保在Java中正确读取输出
  • 然后添加一些参数并确保在java中正确读取输出,
  • 然后添加一些逻辑,并确保从Java正确读取输出。

确保C ++ 总是与Java一起正常工作。如果可以,写下自动化测试:)


发生的事情是,您承诺从一开始就没有端到端的应用程序集成构建。你感受到的痛苦是你在犯罪:P。

我当然是在开玩笑,但是说真的,下次我会建议你尽快整合C ++!它的那些集成点始终是任何软件中的问题来源(我知道)。及早解决它们是确保您以后可以专注于逻辑的好方法。如果我可以建议阅读,请查看Growing object oriented software guided by test,这是对这种方法的一个很好的证明。

答案 1 :(得分:0)

ProcessBuilder创建的进程具有标准输入,输出和错误流,如果您不写入其输入流或从其输出流中读取,它将挂起。有关详细信息,请参阅以下问题:

Why does process hang if the parent does not consume stdout/stderr in Java?

Java ProcessBuilder: Resultant Process Hangs

也可能永远不会启动该进程,因为它正在运行的用户没有启动它的必要权限,或者因为某些DLL无法加载,或者可能由于某些其他原因。

Unable to use taskkill.exe from a Java process

我已经创建了程序的修改版本。当我从命令行运行它时,它能够执行exe文件,但是当我从Eclipse项目执行相同操作时,该过程返回退出代码-1073741515,根据上面的问题,该代码表示​​“应用程序”无法正确初始化。“我认为您需要调查Eclipse调用java来运行您的exe的环境(运行它的用户,如何设置PATH等),以及exe的所有依赖项是否可用(DLL是做什么的)依赖于)来确定它没有成功运行的原因。

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;

public class Runs_An_Exe {
    public static void main(String[] args) throws Exception {
        ProcessBuilder pb = new ProcessBuilder("c:/cygwin/tmp/a.exe");
        pb.redirectErrorStream(true); // redirect stderr to stdin
        Process p = pb.start();

        final StringWriter writer = new StringWriter();
        final InputStreamReader isr = new InputStreamReader(p.getInputStream());
        // capture all output from the process
        new Thread(new Runnable() {
            @Override public void run() {
                readAll(isr, writer);
            }
        }).start();
        // wait for it to finish, and display the exit code
        int result = p.waitFor();
        System.out.println("result: " + result);
        // display any output from the process
        System.out.println(writer.toString());
    }

    private static void readAll(Reader reader, Writer writer) {
        try {
            char[] buffer = new char[8192];
            int n = 0;
            while (-1 != (n = reader.read(buffer))) {
                writer.write(buffer, 0, n);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(我使用的a.exe是在32位Cygwin下使用g ++ 4.8.2从问题的C ++源代码编译而来的。)