使用 qprocess 运行 .exe

Posted

技术标签:

【中文标题】使用 qprocess 运行 .exe【英文标题】:run .exe using qprocess 【发布时间】:2019-03-31 21:57:39 【问题描述】:

我想在 qt 应用程序启动时打开 .exe 文件,并在 qt 应用程序关闭时终止 .exe。

QProcess *proc;

Calculator::Calculator(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Calculator)

    ui->setupUi(this);
    proc = new QProcess(this);
    QString fileName = "/ingredient";
    proc->start(fileName);


Calculator::~Calculator()

    delete ui;
    proc->waitForFinished();
    proc->terminate();

当我运行 Qt 应用程序时,.exe 正在运行。 但是关闭qt应用程序时.exe并没有终止,我该怎么办?

【问题讨论】:

【参考方案1】:

在 Windows 上,您可以使用 Windows API 来终止应用程序。请记住,Qt 会尝试杀死它,但不会确保杀死/结束它。在以下代码中,将 更改为您的应用程序的名称,如果您有足够的权限,这将关闭它。

#include <windows.h>
#include <process.h>
#include <Tlhelp32.h>
#include <winbase.h>
#include <string.h>
void YourClassName::killProcess()

    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    PROCESSENTRY32 pEntry;
    pEntry.dwSize = sizeof (pEntry);
    BOOL hRes = Process32First(hSnapShot, &pEntry);
    while (hRes)
    
        if (_wcsicmp(pEntry.szExeFile, L"<AppName>.exe") == 0) // strcmp changed to _wcsicmp
        
            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
                                          (DWORD) pEntry.th32ProcessID);
            if (hProcess != NULL)
            
                TerminateProcess(hProcess, 9);
                CloseHandle(hProcess);
            
        
        hRes = Process32Next(hSnapShot, &pEntry);
    
    CloseHandle(hSnapShot);

【讨论】:

【参考方案2】:

尝试proc-&gt;kill(); 而不是proc-&gt;terminate();

根据document,terminate()试图终止进程,但可能不会退出进程。

这取决于.exe文件如何处理terminate()发送的信号。

此外,我认为proc-&gt;waitForFinished(); 在您的代码中是多余的。它等待进程完成,而不是告诉进程终止。

【讨论】:

以上是关于使用 qprocess 运行 .exe的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QProcess 运行命令行?

在 PyQt 中使用 QProcess 运行类方法

使用 qprocess 运行 .exe

冻结后使用 QProcess 运行 Python 脚本

如何使用 QProcess 运行 vim 终端

运行文件时如何使用qprocess实时读取输出