exec jar文件时如何打开cmd(qt QProcess)

How to open cmd when exec jar file (qt QProcess)

我用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() 命令来 运行 可见命令提示符 window。将您的代码替换为单行代码:

system(QString("java.exe -jar D:\Programs\Qt\Units\MyJavaProjects\StackExp\target\StackExp-1.0-SNAPSHOT.jar").toStdString().c_str());

如果您只看到 window 闪烁,您可以在 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() 调用块,直到 returns。

如果您想保留进程的句柄,您需要使用 QProcess。您可以 运行 命令提示符如下,但您不会将其视为单独的控制台 window,而是 运行 在后台。不过,您可以在任务管理器中看到它作为命令提示符进程。

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 为进程设置自定义标志来生成前台控制台 window,如下所示:

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