запустить .exe используя qprocess - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу открыть файл .exe при запуске приложения qt и завершить работу .exe при закрытии приложения qt.

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. Тем не менее, .exe не прекращается, когда я закрываю приложение qt, так что мне делать?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

В 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);
}
1 голос
/ 01 апреля 2019

Попробуйте proc->kill(); вместо proc->terminate();

Согласно документу , terminate() пытается завершить процесс, но не может выйти из процесса.

Это зависит от того, как файл .exe обрабатывает сигнал, отправленный terminate().

Кроме того, я думаю, что proc->waitForFinished(); избыточен в вашем коде. Он ожидает завершения процесса, вместо того чтобы сказать, что процесс завершается.

...