2014-04-01 84 views
0

主要問題是我無法通過Java運行它來運行我的C++邏輯; 我是否正確創建子流程?有沒有其他方法可以從Java運行.exe文件?

謝謝大家; ---更新! ---

所以我寫了這些來測試以最純粹的方式打開.exe的能力; 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; 
} 

輸出:

+1

如果您有任何關於生產空白文件子進程的問題,詢問有關*的問題,而不是尋找從Java調用您的代碼的另一種方式。也許這個錯誤在你的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調用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

使用Eclipse中的運行按鈕跑是 你用正確的參數來調用它? C++是否有正確的工作目錄? Java是否正確解析stdout?如果你只是在C++中做一個hello world,你能用Java看到它嗎?

我建議從頭開始背,讓它用最簡單的可選C工作++程序,並慢慢complexify的C++(在邏輯放回)從Java

  • 首先調用的Hello World,並確保輸出在Java中正確讀取
  • 然後添加幾個參數並確保在java中輸出正確讀取,
  • 然後添加一些邏輯,並確保從Java正確讀取輸出。

並確保C++是一直與Java正常工作。編寫自動測試,如果你能:)


發生了什麼事是你承諾沒有從一開始你的應用程序的終端到終端的整合構建的資本罪。你感到的痛苦是你放棄了你的犯罪行爲:P。

我當然在開玩笑,但認真的是,下一次,我會建議儘快整合C++!它的那些集成點始終是任何軟件的問題來源(我知道)。儘早解決這些問題是確保您以後可以專注於邏輯的好方法。如果我可以建議閱讀,請查看Growing object oriented software guided by test,這是這種方法的一個很好的示範。

+0

剛剛用一個簡單的hello.cpp進行了測試:沒有參數;絕對目錄/ Eclipse沒有抱怨沒有找到該文件;我有上面的代碼處理stdout對我來說,迄今尚未被稱爲錯誤...和hello.cpp仍然沒有任何... – user2738698

+0

奇怪的是,嘗試調用系統級別的exe首先,像' dir'。也許Java不會抱怨,但仍然無法正常工作。用'waitFor'檢查返回碼。是0嗎?改變C++,在main的末尾做一個'return 1'。它在Java中改變'waitFor'的值嗎?如果不是,你可能不會說正確的過程。在創建過程之前執行'pb.redirectErrorStream(true);'。是否出現錯誤行? –

相關問題