C++ 使用qprocess运行.exe

C++ 使用qprocess运行.exe,c++,qt,qprocess,C++,Qt,Qprocess,我想在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";

我想在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没有终止,所以我应该怎么做?

尝试
proc->kill()而不是
proc->terminate()

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

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


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

在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);
}
#包括
#包括
#包括
#包括
#包括
作废YourClassName::killProcess()
{
HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,NULL);
流程32五分制;
pEntry.dwSize=sizeof(pEntry);
BOOL hRes=Process32First(hSnapShot和pEntry);
while(hRes)
{
如果(_wcsicmp(pEntry.szExeFile,L“.exe”)==0)//strcmp更改为_wcsicmp
{
HANDLE hProcess=OpenProcess(进程终止,0,
(DWORD)pEntry.th32ProcessID);
if(hProcess!=NULL)
{
终止进程(hProcess,9);
CloseHandle(hProcess);
}
}
hRes=Process32Next(hSnapShot和pEntry);
}
闭合手柄(hSnapShot);
}