运行 .exe 使用 qprocess
run .exe using 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";
proc->start(fileName);
}
Calculator::~Calculator()
{
delete ui;
proc->waitForFinished();
proc->terminate();
}
当我运行Qt应用程序时,.exe是运行ning。
但是关闭qt应用程序时.exe并没有终止,怎么办?
尝试 proc->kill();
而不是 proc->terminate();
根据 document,terminate()
尝试终止进程,但可能不会退出进程。
这取决于.exe文件如何处理terminate()
发送的信号。
此外,我认为 proc->waitForFinished();
在您的代码中是多余的。它等待进程完成,而不是告诉进程终止。
在 windows 上,您可以使用 windows API 终止应用程序。请记住,Qt 会尝试终止它,但不会确保 kill/end 它。在以下代码中,将 更改为您的应用程序名称,如果您有足够的权限,这将关闭它。
#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);
}
我想在 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是运行ning。 但是关闭qt应用程序时.exe并没有终止,怎么办?
尝试 proc->kill();
而不是 proc->terminate();
根据 document,terminate()
尝试终止进程,但可能不会退出进程。
这取决于.exe文件如何处理terminate()
发送的信号。
此外,我认为 proc->waitForFinished();
在您的代码中是多余的。它等待进程完成,而不是告诉进程终止。
在 windows 上,您可以使用 windows API 终止应用程序。请记住,Qt 会尝试终止它,但不会确保 kill/end 它。在以下代码中,将 更改为您的应用程序名称,如果您有足够的权限,这将关闭它。
#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);
}