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.exe
和javaw.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();
我用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()
命令来 运行 可见命令提示符 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();