C++ 使用qprocess运行.exe
我想在qt应用程序启动时打开.exe文件,在qt应用程序关闭时终止.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";
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);
}