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



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

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

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

爪哇文件:

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;
}

输出:

你用正确的参数来称呼它吗?C++是否有正确的工作目录?Java 解析标准输出是否正确?如果你只在C++做一个hello world,你能在Java中看到它吗?

我建议从头开始,让它与最简单的C++程序一起工作,并慢慢地使C++复杂化(回到你的逻辑中)

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

并确保C++始终在 Java 中正常工作。如果可以:),请编写自动测试


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

当然是在开玩笑,但说真的,下次,我建议尽快整合C++!它的那些集成点始终是任何软件中问题的根源(我知道)。尽早解决它们是确保以后可以专注于逻辑的好方法。如果我能建议阅读,请查看由测试指导的面向对象软件的增长,这是这种方法的一个很好的演示。

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

如果父级不使用 Java 中的 stdout/stderr,为什么进程会挂起?

Java ProcessBuilder:Resultant Process Hangs

也可能是该进程永远不会启动,因为

运行该进程的用户没有启动它所需的权限,或者因为无法加载某些 DLL,或者可能是由于某些其他原因。

无法从 Java 进程使用 taskkill.exe

我已经创建了您的程序的修改版本。当我从命令行运行它时,它能够执行 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 是从您在问题中使用 g++ 4.8.2 在 32 位 Cygwin 下C++来源编译的。

相关内容

  • 没有找到相关文章

最新更新