簡體   English   中英

如何在執行 jar 文件(qt QProcess)時打開 cmd

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

我使用 Windows。 我想在正在運行的 jar 應用程序(java/javaw)中使用 QProcess。 開始之后,打開 cmd 向我顯示有關使用我的 jar 應用程序的信息。

My problem is: when I exec my qt code, the Java app starts (in the background), but cmd doesn't open with the Java runtime.

我的代碼:

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。 用 oneliner 替換你的代碼:

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()調用會阻塞,直到它返回。

如果要保留進程的句柄,則需要使用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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM