QT QAxObject调用Bartender时程序退出,bartender进程未退出问题

这个问题困扰了很久,一直在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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值