2012-07-02 28 views
5

Làm cách nào để gửi dữ liệu chuỗi từ Java sang ứng dụng bảng điều khiển C++ trong Windows? Tôi cố gắng để làm điều này:Soạn thảo Ứng dụng giao diện C++ được tạo trong ứng dụng Java Dưới Windows

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 
String o = ...; 
proc.getOutputStream().write(o.getBytes()); 

Nhưng tôi không bao giờ nhìn thấy nó trên mặt C++ khi tôi làm điều này:

ReadFile(stdin_h,buf, sizeof(buf), &bytes, 0) 

ReadFile không bao giờ trở lại.

Điều gì sau đây là xây dựng thêm và mã mẫu.


Tôi đã viết một ứng dụng giao diện điều khiển C++ đơn giản (Win32) đọc từ STDIN và thực hiện các tác vụ dựa trên đầu vào.

Bây giờ tôi muốn viết một ứng dụng Java để "điều khiển" ứng dụng C++. Java applicaton nên:

  1. Khởi động ứng dụng C++ sử dụng Runtime.exec()
  2. dữ liệu Viết chuỗi C++ ứng dụng của STDIN
  3. Lặp lại cho đến khi nó là thời gian để chết.

Ứng dụng Java của tôi có vẻ đang hoạt động, nhưng ứng dụng C++ không bao giờ nhận được bất kỳ dữ liệu nào trên STDIN.

Đây là ứng dụng C++:

int main() 
{ 
    ofstream f("c:\\temp\\hacks.txt"); 

    HANDLE stdin_h = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD file_type = GetFileType(stdin_h); 
    if(file_type != FILE_TYPE_CHAR) 
     return 42; 

    f << "Pipe" << endl; 
    for(bool cont = true; cont;) 
    { 
     char buf[64*1024] = {}; 
     DWORD bytes = 0; 
     if(ReadFile(stdin_h,buf, sizeof(buf), &bytes, 0)) 
     { 
      string in(buf,bytes); 
      cout << "Got " << in.length() << " bytes: '" << in << "'" << endl; 
      f << "Got " << in.length() << " bytes: '" << in << "'" << endl; 
      if(in.find('Q')) 
       cont = false; 
     } 
     else 
     { 
      cout << "Err " << GetLastError() << " while reading file" << endl; 
      f << "Err " << GetLastError() << " while reading file" << endl; 
     } 
    } 
} 

Và đây là mặt Java:

public static void main(String[] args) { 
    Runtime rt =Runtime.getRuntime(); 
    try { 
     Process proc = rt.exec("c:\\dev\\hacks\\x64\\debug\\hacks.exe"); 

     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 

     int a = 0; 
     while(a < 5) 
     { 
      String o = (a == 4 ? "Q\n" : "A\n"); 
      proc.getOutputStream().write(o.getBytes()); 
      System.out.println("Wrote '" + o + "'"); 
      ++a; 
     } 
     try { 
      proc.waitFor(); 

      // TODO code application logic here 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Java_hacks.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(Java_hacks.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Phía Java dường như được làm việc một cách chính xác, nhưng tôi không bao giờ nhận được chuỗi trên phía C++.

Tôi có làm gì sai ở đây không? Làm thế nào tôi có thể gửi dữ liệu chuỗi từ Java đến một ứng dụng giao diện điều khiển C++ trong Windows?

Trả lời

4

Tại sao bạn không xóa luồng đầu ra ở phía Java sau khi viết 5 chuỗi?

proc.getOutputStream().flush(); 
+2

+1: Uh, vì tôi không đủ thông minh để biết rằng tôi nên làm. :) Chờ một chút, để tôi thử. –

+0

Bingo! Tôi biết chúng ta không được phép nói "cảm ơn", nhưng cảm ơn. Phiên gỡ lỗi 6 giờ của tôi đã kết thúc. –

+0

LOL! : D \ o/Rất vui vì tôi đã giúp bạn ạ :) – t0mm13b

Các vấn đề liên quan