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.exejavaw.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();