问题描述
我使用 Windows。我想在正在运行的 jar 应用程序 (java/javaw) 中使用 QProcess。启动后,打开 cmd 向我显示有关工作我的 jar 应用程序的信息。
我的问题是:当我执行我的 qt 代码时,Java 应用程序启动(在后台),但 cmd 没有随 Java 运行时打开。
我的代码:
QProcess process;
process.setWorkingDirectory("D:\\Programs\\Qt\\Units\\MyJavaProjects\\StackExp\\target");
process.setProgram("java.exe");
process.setArguments({"-jar","StackExp-1.0-SNAPSHOT.jar"});
process.start();
process.waitForFinished (-1);
if (!process.waitForStarted())
{
qDebug() << "1: " +process.readAllStandardOutput();
qDebug() << "2: " +process.readAllStandardError();
qDebug() << "The process didnt start" << process.error();
}
我的 jar 应用程序是在 maven 中构建的,它的类型是:Java 应用程序。
我使用 java.exe
和 javaw.exe
,这两个运行时都没有打开 cmd。
如何使用 QProcess 或其他方式执行 jar 应用程序,同时打开 cmd 以查看有关工作 jar 应用程序的信息?
解决方法
您可以使用 system()
命令运行可见的命令提示符窗口。用 oneliner 替换你的代码:
system(QString("java.exe -jar D:\\Programs\\Qt\\Units\\MyJavaProjects\\StackExp\\target\\StackExp-1.0-SNAPSHOT.jar").toStdString().c_str());
如果你只看到一个闪烁的窗口,你可以在你的 java 调用之后添加超时调用,如下所示找出 java 调用出了什么问题:
system(QString("java.exe -jar D:\\Programs\\Qt\\Units\\MyJavaProjects\\StackExp\\target\\StackExp-1.0-SNAPSHOT.jar & TIMEOUT 5").toStdString().c_str());
注意 system()
调用会阻塞直到它返回。
如果要保留进程的句柄,则需要使用 QProcess
。您可以按如下方式运行命令提示符,但您不会将其视为单独的控制台窗口,而是在后台运行。你可以在任务管理器中看到它作为命令提示符进程。
QProcess process;
process.setWorkingDirectory("D:\\Programs\\Qt\\Units\\MyJavaProjects\\StackExp\\target");
process.setProgram("cmd.exe");
process.setArguments({"/c","java.exe -jar StackExp-1.0-SNAPSHOT.jar"});
process.start();
process.waitForFinished();
qDebug() << "1: " +process.readAllStandardOutput();
qDebug() << "2: " +process.readAllStandardError();
更新:
您似乎可以通过使用 QProcess::setCreateProcessArgumentModifier 为进程设置自定义标志来生成前台控制台窗口,如下所示:
process.setCreateProcessArgumentsModifier(
[](QProcess::CreateProcessArguments *args) {
args->flags |= CREATE_NEW_CONSOLE;
args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
});
使用 ping
命令测试:
#include <windows.h>
QProcess process;
process.setProgram("cmd.exe");
process.setArguments({"/c","ping 127.0.0.1"});
process.setCreateProcessArgumentsModifier(
[](QProcess::CreateProcessArguments *args) {
args->flags |= CREATE_NEW_CONSOLE;
args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
});
process.start();
process.waitForFinished();