我正在尝试在远程 Windows 机器上从 java 执行 c++ 代码。为了处理远程部分,我创建了一个使用 Runtime.exec() 运行实际命令的 Web 服务。没有直接从 java 代码调用 c++ exe。我有一个最终调用 exe 的批处理文件。
问题是,java 和 c++ 进程都挂起。服务器端的 java 代码确实处理输出流和错误流。此外,c++ 代码将所有内容记录在 Windows 上的文件中。奇怪的是,当我删除 WS 调用并将服务器端的 java 代码作为独立的 java 程序运行时,它成功了。这是java代码:
public class RunCPlusPlusExecutable {
public int runExecutable() {
int exitValue = 0;
try {
Process p = null;
Runtime rt = Runtime.getRuntime();
System.out.println("About to execute" + this + rt);
p = rt.exec("c:/temp/execcplusplus.bat");
System.out.println("Process HashCode=" + p.hashCode());
StreamProcessor errorHandler = new StreamProcessor(p.getErrorStream(), "Error");
StreamProcessor outputHandler = new StreamProcessor(p.getInputStream(), "Output");
errorHandler.start();
outputHandler.start();
exitValue = p.waitFor();
System.out.println("Exit value : " + exitValue);
if (exitValue == 0)
System.out.println("SUCCESS");
else
System.out.println("FAILURE");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
}
return exitValue;
}
class StreamProcessor extends Thread {
private InputStream is = null;
private String type = null;
private InputStreamReader isr = null;
private BufferedReader br = null;
private FileWriter writer = null;
private BufferedWriter out = null;
StreamProcessor(InputStream is, String type) {
this.is = is;
this.type = type;
}
public void run() {
try {
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
writer = new FileWriter("*******path to log file********");
out = new BufferedWriter(writer);
String line = null;
while ((line = br.readLine()) != null) {
Date date = new Date();
out.write("[" + type + "]: " + date + " : " + line);
out.newLine();
}
writer.flush();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (br != null)
br.close();
if (isr != null)
isr.close();
if (out != null)
out.close();
if (writer != null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
知道是什么导致了问题以及如何调试它吗?请注意,我将无法调试 c++ 代码。
谢谢
更新 1: 这里有一些更多细节...... WS 服务器正在从某个管理员用户运行。而且我一直在运行其他用户的独立 java 程序。*从 WS 调用执行时,c++ 可执行文件似乎给出了引用的内存错误。有弹出窗口使用“确定”和“取消”按钮引用错误。*
更新 2: 部署 WS 的 tomcat 服务器作为 Windows NT 服务运行。这可能是错误的原因吗?如果是,如何解决这个问题?