如何解决exec jar文件qt QProcess时如何打开cmd
我使用 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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。