在Windows下编写Java应用程序中生成的C ++控制台应用程序

时间:2012-07-02 23:52:22

标签: java c++ windows console

如何在Windows下将字符串数据从Java发送到C ++控制台应用程序?我想这样做:

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

但是当我这样做时,我从未在C ++方面看到它:

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

ReadFile永远不会回来。

以下是进一步的详细说明和示例代码。


我编写了一个简单的C ++控制台(Win32)应用程序,它从STDIN读取并根据输入执行操作。

现在我想编写一个Java应用程序来“驱动”C ++应用程序。 Java应用程序应该:

  1. 使用Runtime.exec()
  2. 启动C ++应用程序
  3. 将字符串数据写入C ++应用程序的STDIN
  4. 重复直到死亡为止。
  5. 我的Java应用程序似乎正在运行,但C ++应用程序从未在STDIN上接收任何数据。

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

    这是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);
        }
    }
    

    Java端似乎工作正常,但我没有收到C ++方面的字符串。

    我在这里做错了吗?如何在Windows下将字符串数据从Java发送到C ++控制台应用程序?

1 个答案:

答案 0 :(得分:4)

在写完5个字符串后,为什么不在Java端上刷新输出流?

proc.getOutputStream().flush();