2014-04-01 8 views
0

주요 문제는 Java를 통해 C++ 로직을 실행할 수 없다는 것입니다. 하위 프로세스가 올바르게 생성됩니까?Java에서 .exe를 실행할 수있는 다른 방법이 있습니까?

감사합니다. --- 업데이트! ---

그래서 나는 .exe를 가장 순수한 방법으로 열 수있는 능력을 테스트하기 위해 이것을 작성했습니다. 이클립스는 파일을 볼 수 있으며 거기에 없다고 불평하지 않는다.

자바 파일 :

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

출력 :

+1

당신이 빈 파일을 생성 서브 프로세스에 문제가 있다면, Java에서 코드를 호출하는 또 다른 방법을 찾기보다는 * that * 문제에 대해 물어보십시오. 어쩌면 버그는 C++ 코드 (연결된 터미널없이 실행될 때)에있을 수 있습니다. –

+0

@ Greg하지만 명령 행을 사용하여 작동합니다. – user2738698

+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가 exe를 실행하기 위해 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를 사용하여 질문에 C에서 ++ 소스를 컴파일 된 32 비트 Cygwin에서.)

2

이클립스에서 실행 버튼을 사용하여 실행 Are 당신은 올바른 주장을하고 그것을 부릅니까? C++에 올바른 작업 디렉토리가 있습니까? Java가 stdout을 올바르게 구문 분석합니까? C++에서만 안녕하세요 세상을한다면 Java에서 볼 수 있습니까?

I 제안 다시 처음부터 시작, ++는 가장 간단한 C와 함께 작동 프로그램을 천천히 C를 complexify ++ (논리에서 다시 넣어)

  • 먼저 자바에서 안녕하세요 세계를 호출하고 보장 출력이 Java에서 올바르게 읽혀집니다.
  • 그런 다음 몇 가지 인수를 추가하고 출력이 Java에서 올바르게 읽혀 지는지 확인하십시오.
  • 그런 다음 로직을 조금 추가하고 Java에서 출력이 올바르게 읽히도록하십시오.

그리고 C++이 인데 항상이 Java에서 올바르게 작동하는지 확인하십시오. 당신이 무슨 일


당신이 처음부터 애플리케이션의 엔드 - 투 - 엔드 통합 빌드를 가지고 있지의 자본 죄를 저지른 것입니다 :) 수있는 경우 자동화 된 테스트를 작성합니다. 당신이 느끼는 고통은 당신이 당신의 범죄를 기소하고 있다는 것입니다 : P.

나는 농담이지만, 진지하게, 다음에는 가능한 한 빨리 C++을 통합 할 것을 제안합니다! 모든 소프트웨어에서 항상 문제의 원인이되는 통합 지점 (내가 아는 것)입니다. 이를 조기에 해결하면 나중에 로직에 집중할 수 있습니다. 독서를 제안 할 수 있다면 Growing object oriented software guided by test을 확인해보세요. 이런 접근법에 대한 훌륭한 시연입니다.

+0

그냥 간단한 hello.cpp로 테스트했습니다. 인수가 없습니다. 절대 디렉토리/이클립스는 파일을 찾지 못했다고 불평하지 않았다. 나는 위의 코드를 가지고있다. 나는 stdout을 다루고 있는데, 지금까지는 잘못 호출되지 않았고, hello.cpp는 여전히 아무것도하지 않는다 ... – user2738698

+0

이상한, 시스템 레벨의 exe를 먼저 호출해라. dir'. Java가 불평하지는 않지만 여전히 작동하지 않을 수 있습니다. 'waitFor'로 리턴 코드를 확인하십시오. 0입니까? C++을 변경하고, main의 끝에서'return 1 '을하십시오.Java에서'waitFor'의 값을 변경합니까? 그렇지 않은 경우 올바른 프로세스를 호출 할 수 없습니다. 프로세스를 생성하기 전에'pb.redirectErrorStream (true);'을 수행하십시오. 오류 라인이 나타 납니까? –

관련 문제