5
我如何從Java發送字符串數據到一個C++控制檯應用程序在Windows下?我試圖做到這一點:寫C++控制檯應用程序催生在Java應用程序在Windows
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的一個應用應該:
- 開始使用
Runtime.exec()
- 寫入字符串數據到C++應用程序的標準輸入
- 重複,直到它的時候死的C++應用程序。
我的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:嗯,因爲我不是足夠聰明,知道我應該。 :)等一下,讓我試試看。 –
賓果!我知道我們不應該說「謝謝」,但謝謝。我的6小時調試會議已經結束。 –
哈哈! :D \ o /很高興我對你有幫助:) – t0mm13b