这个问题困扰了很久,一直在QAxObject实例上找问题,一直没找到,到最后想了个办法,根据进程pid号来杀死进程。
在连接bartender控件之前用pidList1记录下bartend.exe的进程pid列表,连接bartender后在用pidList2记录下新的bartend.exe的进程pid列表。
m_barTender = new QAxObject();
QList<quint64> pidList1 = listProcessIdentifier("bartend.exe");
qDebug() << "进程号1:" << pidList1;
m_barTender->setControl("BarTender.Application");//连接BarTender控件
QList<quint64> pidList2 = listProcessIdentifier("bartend.exe");
qDebug() << "进程号2:" << pidList2;
//输出两个qlist不同的成员数据
try {
differentItem = findDifference(pidList1, pidList2);
qDebug() << "The unique different item is:" << differentItem;
} catch (const std::runtime_error &e) {
qDebug() << e.what();
}
会发现setControl会产生一个新的进程号,这个进程号就是qt程序调用bartender产生的进程,此进程在qt程序退出时不会正常退出。
然后在mainwindow.cpp的析构函数中,杀死此进程。
MainWindow::~MainWindow()
{
KillProcess(differentItem);
delete ui;
}
最后成功实现bartend.exe进程退出。最后附上各功能函数代码。
//找到两个qlist的不同数据
template <typename T>
T findDifference(const QList<T> &list1, const QList<T> &list2) {
// Assuming there's only one difference
for (const T &item : list1) {
if (!list2.contains(item)) {
return item;
}
}
for (const T &item : list2) {
if (!list1.contains(item)) {
return item;
}
}
// In case no difference is found, which should not happen based on the assumption
throw std::runtime_error("No unique difference found");
}
//根据pid号退出进程
inline void KillProcess(qint64 pid)
{
// qint64 pid = m_pid;
#ifdef WIN32//Windows系统
/**
* 强制杀死当前进程,同时推出所有子线程
* TASKKILL 参数解释:
* /T : 杀死当前进程启动和其启动的所有子线程
* /F: 强制杀死进程
* */
qDebug() << "退出进程";
QString cmd = QString("TASKKILL /PID %1 /F").arg(pid);//Windows 系统下,杀死当前进程命令,不杀死其开启的子进程
// QString cmd = QString("TASKKILL /PID %1 /T /F").arg(pid);//Windows 系统下,杀死当前进程树,包括其开启的子进程
//@ 可以,无dos黑窗口
WinExec(cmd.toLocal8Bit().data(), SW_HIDE);//SW_HIDE:控制运行cmd时,不弹出cmd运行窗口
#endif
}