¿Cómo puedo enviar datos de cadena de Java a una aplicación de consola de C++ en Windows? Estoy tratando de hacer esto:escrito a C++ aplicación de consola dio lugar a la aplicación Dentro de Java en Windows
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));
String o = ...;
proc.getOutputStream().write(o.getBytes());
Pero no lo veo en el lado de C++ cuando hago esto:
ReadFile(stdin_h,buf, sizeof(buf), &bytes, 0)
ReadFile
nunca se regresa.
Lo que sigue es una mayor elaboración y código de ejemplo.
He escrito una sencilla aplicación de consola de C++ (Win32), que se lee de STDIN y lleva a cabo acciones basadas en la información.
Ahora quiero escribir una aplicación Java para la aplicación "unidad" C++. El applicaton Java debe:
- de inicio de la aplicación de C++ utilizando
Runtime.exec()
- datos de cadena Escribir al STDIN
- Repita la aplicación de C++ hasta que sea el momento de morir.
Parece que mi aplicación Java funciona, pero la aplicación C++ nunca recibe datos en STDIN.
Aquí está la aplicación 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;
}
}
}
Y aquí es el lado de 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);
}
}
El lado de Java parece estar funcionando correctamente, pero no estoy siquiera recibir las cuerdas de el lado de C++.
¿Estoy haciendo algo mal aquí? ¿Cómo puedo enviar datos de cadena desde Java a una aplicación de consola C++ en Windows?
+1: Uh, porque no soy lo suficientemente inteligente como para saber que debería. :) Espera un segundo, déjame intentar eso. –
¡Bingo! Sé que se supone que no debemos decir "gracias", pero gracias. Mi sesión de depuración de 6 horas ha llegado a su fin. –
¡LOL! : D \ o/Me alegro de haber sido de ayuda para usted señor :) – t0mm13b