5

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二度と戻らない。

以下は、さらなる詳細とサンプルコードです。


STDINから読み取り、入力に基づいてアクションを実行する単純なC ++コンソール(Win32)アプリケーションを作成しました。

次に、C++アプリケーションを「駆動」するJavaアプリケーションを作成します。Javaアプリケーションは次のことを行う必要があります。

  1. を使用してC++アプリケーションを起動しますRuntime.exec()
  2. 文字列データをC++アプリのSTDINに書き込みます
  3. 死ぬ時まで繰り返します。

私の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++コンソールアプリケーションに文字列データを送信するにはどうすればよいですか?

4

1 に答える 1

4

5つの文字列を書き込んだ後、Java側で出力ストリームをフラッシュしないのはなぜですか?

proc.getOutputStream().flush();
于 2012-07-02T23:58:07.500 に答える