Java 在JNA和spwaning childprocess中以静默方式重定向输出(无弹出命令窗口)
我已经为spwan子java进程编写了一个java程序。当它生成子进程时,会打开一个命令提示符窗口,输出重定向到命令提示符。您能告诉我如何在没有额外命令窗口的情况下生成/创建子进程,并将该进程的输出重定向到文件中吗。我正在使用Java6和JNA3.5.2 下面是创建进程的命令Java 在JNA和spwaning childprocess中以静默方式重定向输出(无弹出命令窗口),java,jna,Java,Jna,我已经为spwan子java进程编写了一个java程序。当它生成子进程时,会打开一个命令提示符窗口,输出重定向到命令提示符。您能告诉我如何在没有额外命令窗口的情况下生成/创建子进程,并将该进程的输出重定向到文件中吗。我正在使用Java6和JNA3.5.2 下面是创建进程的命令 cmd = "c:\\jdk1.6.0_30\\bin\\java.exe -Xmx256m -Xss1024k -cp <classpath jars>; -Dorg.omg.CORBA.ORBClass
cmd = "c:\\jdk1.6.0_30\\bin\\java.exe -Xmx256m -Xss1024k -cp <classpath jars>;
-Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB com.xyz.test.MainProgram <program arguments>
在windows上,调用
javaw.exe
而不是java.exe
。这将避免出现“控制台”窗口
至于重定向到文件,最简单的方法可能是向Java子进程传递一个参数以指示所需的文件,然后重定向System.out
和System.err
以写入该文件
System.out
和System.err
是PrintStream
s,因此启动时您只需创建自己的(映射到FileOutputStream
)即可重定向所有控制台输出。有关详细信息,请参阅。我可以在创建进程选项中使用以下修改创建静默进程(无控制台)但仍需要您的帮助来重定向流程输出
javaw不能解决我的问题。请参阅下面我关于创建静默进程的回答。为什么运行javaw.exe不会阻止控制台窗口显示?顺便说一句,您应该编辑原始问题,而不是添加部分“答案”。您是否阅读了上面描述如何重定向Java进程输出的StackOverflow链接?
int STARTF_USESTDHANDLES = 0x00000100;
WinBase.PROCESS_INFORMATION.ByReference processInformation = new WinBase.PROCESS_INFORMATION.ByReference();
STARTUPINFO startupInfo = new STARTUPINFO();
// Create the child process.
if (!Kernel32.INSTANCE.CreateProcess(
null,
cmd,
null,
null,
true,
new DWORD(0x00000020), //new DWORD(0x00000001)
null,
null,
startupInfo,
processInformation)){
System.err.println(Kernel32Util.formatMessageFromLastErrorCode(Kernel32.INSTANCE.GetLastError()));
return false;
}else {
System.out.println("Created Process :"+processInformation.dwProcessId.intValue());
processData.setProcessId(processInformation.dwProcessId.intValue());
//processData.sethProcess(processInformation.hProcess);
//com.sun.jna.platform.win32.Kernel32.INSTANCE.WaitForSingleObject(processInformation.hProcess, 0xFFFFFFFF);
com.sun.jna.platform.win32.Kernel32.INSTANCE.CloseHandle(processInformation.hProcess);
com.sun.jna.platform.win32.Kernel32.INSTANCE.CloseHandle(processInformation.hThread);
return true;
}
} </pre>
private boolean createChildProcess(ProcessData processData,String cmd,String appName){
//Tried with Output to file
HANDLEByReference childStdInRead = new HANDLEByReference();
HANDLEByReference childStdInWrite = new HANDLEByReference();
HANDLEByReference childStdOutRead = new HANDLEByReference();
HANDLEByReference childStdOutWrite = new HANDLEByReference();
int STARTF_USESTDHANDLES = 0x00000100;
WinBase.PROCESS_INFORMATION.ByReference processInformation = new WinBase.PROCESS_INFORMATION.ByReference();
STARTUPINFO startupInfo = new STARTUPINFO();
startupInfo.cb = new DWORD(processInformation.size());
startupInfo.hStdError = childStdOutWrite.getValue();
startupInfo.hStdOutput = childStdOutWrite.getValue();
startupInfo.hStdInput = childStdInRead.getValue();
startupInfo.dwFlags |= STARTF_USESTDHANDLES;
SECURITY_ATTRIBUTES saAttr = new SECURITY_ATTRIBUTES();
saAttr.dwLength = new DWORD(saAttr.size());
saAttr.bInheritHandle = true;
saAttr.lpSecurityDescriptor = null;
// Create a pipe for the child process's STDOUT.
if (!com.sun.jna.platform.win32.Kernel32.INSTANCE.CreatePipe(childStdOutRead, childStdOutWrite, saAttr, 0)){
System.err.println(Kernel32.INSTANCE.GetLastError());
}
// Ensure the read handle to the pipe for STDOUT is not inherited.
if (!com.sun.jna.platform.win32.Kernel32.INSTANCE.SetHandleInformation(childStdOutRead.getValue(), HANDLE_FLAG_INHERIT, 0)){
System.err.println(Kernel32.INSTANCE.GetLastError());;
}
// Create the child process.
if (!Kernel32.INSTANCE.CreateProcess(
null,
cmd,
null,
null,
true,
new DWORD(0x00000020), //new DWORD(0x00000001)
null,
null,
startupInfo,
processInformation)){
System.err.println(Kernel32Util.formatMessageFromLastErrorCode(Kernel32.INSTANCE.GetLastError()));
return false;
}else {
System.out.println("Created Process :"+processInformation.dwProcessId.intValue());
processData.setProcessId(processInformation.dwProcessId.intValue());
//processData.sethProcess(processInformation.hProcess);
//com.sun.jna.platform.win32.Kernel32.INSTANCE.WaitForSingleObject(processInformation.hProcess, 0xFFFFFFFF);
HANDLE inputFile = com.sun.jna.platform.win32.Kernel32.INSTANCE.CreateFile(
"c:\\"+processInformation.dwProcessId.intValue()+".txt",
GENERIC_READ,
0,
null,
OPEN_EXISTING,
FILE_ATTRIBUTE_READONLY,
null);
//ReadFromPipe(childStdOutRead,childStdOutWrite);
com.sun.jna.platform.win32.Kernel32.INSTANCE.CloseHandle(processInformation.hProcess);
com.sun.jna.platform.win32.Kernel32.INSTANCE.CloseHandle(processInformation.hThread);
return true;
}
}
Kernel32.INSTANCE.CreateProcess(
null,
cmd,
null,
null,
true,
new DWORD(WinBase.CREATE_NO_WINDOW),
null,
null,
startupInfo,
processInformation)