IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Qt 强杀进程、子进程(应用)的一种方式 -> 正文阅读

[C++知识库]Qt 强杀进程、子进程(应用)的一种方式

一、背景

一般情况下,程序退出时,它调用的所有子进程都会一起退出。但异常退出的时候,并非所有的子进程都能正确退出。所以我们的做法一般都是在程序启动的前来一次检查,将上次启动没有退出的子进程杀掉,然后再继续运行程序。

二、清理进程方式一

1. 使用QProcess 执行杀进程命令:

QVector<DWORD> getCurPathSubProcessIdByProcessName(const QString &name)
{
    Q_UNUSED(name)
    QVector<DWORD> processIds;

    HANDLE hSnapshot;
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//拍摄进程快照
    qInfo() << __FUNCTION__ << "exeName" << name;

    if (hSnapshot == INVALID_HANDLE_VALUE) {    //拍摄快照失败
        qWarning() << __FUNCTION__ << "create snapshot faile";
        return processIds;
    }

    PROCESSENTRY32 ps;
    ZeroMemory(&ps, sizeof(PROCESSENTRY32));
    ps.dwSize = sizeof(PROCESSENTRY32);

    if (!Process32First(hSnapshot, &ps)) {
        qWarning() << __FUNCTION__ << "process32First faile";
        return processIds;
    }

    do {
        if (lstrcmpi(ps.szExeFile, name.toStdWString().data()) == 0) {
            std::wstring exePath = getProcessExePathByPid(ps.th32ProcessID);
            QDir dir;
            QString qExePath = dir.toNativeSeparators(QString::fromStdWString(exePath));
            QString appPath = dir.toNativeSeparators(
                                  QCoreApplication::applicationDirPath());
            qInfo() << __FUNCTION__ << exePath << qExePath << appPath;

            if (qExePath.startsWith(appPath)) {
                processIds.append(ps.th32ProcessID);
            }
        }
    } while (Process32Next(hSnapshot, &ps));

    qInfo() << __FUNCTION__ << "processIds :" << processIds;
    return processIds;
}

void ClearProcessByProcessName(const QString &strPrcessName)
{
    if (strPrcessName.isEmpty()) {
        return;
    }

    // 通过进程名获取和当前进程path一致的子进程
    QVector<DWORD> processIds = getCurPathSubProcessIdByProcessName(
                                    strPrcessName);

    for (int i = 0; i < processIds.size(); ++i) {
        QString strCmdLine = QString("TASKKILL /IM %1 /F").arg(processIds.at(i));
        int nExitCode = QProcess::execute(strCmdLine);
    }

}

2. 执行清理

    ClearProcessByProcessName("myapp.exe");

三、清理进程方式二

1. 使用进程管理快照,遍历查询名称

void ClearProcessByProcessName(const QString &strPrcessName)
{
    PROCESSENTRY32 pe32;
    pe32.dwSize=sizeof(pe32);
    HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    BOOL bMore=::Process32First(hProcessSnap,&pe32);
    while(bMore) {
        int len= WideCharToMultiByte(CP_ACP, 0, pe32.szExeFile, wcslen(pe32.szExeFile),
                                     NULL, 0, NULL, NULL);
        char* m_char = new char[len+1];
        WideCharToMultiByte(CP_ACP, 0, pe32.szExeFile, wcslen(pe32.szExeFile),
                            m_char, len, NULL, NULL);
        m_char[len]='\0';

        if(strcmp(strPrcessName.toStdString().c_str(), m_char) == 0) {
            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
            if(hProcess != NULL) {
                TerminateProcess(hProcess, 0);
            }
        }

        bMore=::Process32Next(hProcessSnap,&pe32);

        delete[] m_char;
    }
}

2. 执行清理?

    ClearProcessByProcessName("myapp.exe");

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:13:22  更:2022-03-10 22:14:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:01:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码