qt编写的windwos下进程守护程序

1. 思路:循环检测守护的进程是否仍然在运行,如停止运行,重启程序

2.代码

#include <QApplication>
#include <QFileDialog>
#include <QSettings>
#include <windows.h>
#include <QDebug>
#include <Tlhelp32.h>
#include <cstdlib>
#include <QDateTime>
#include <QTextStream>

#define KEY_EXE_PATH "EXE_PATH"

BOOL IsExistProcess(const char*  szProcessName)
{
    PROCESSENTRY32 processEntry32;
    HANDLE toolHelp32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (((int)toolHelp32Snapshot) != -1)
    {
        processEntry32.dwSize = sizeof(processEntry32);
        if (Process32First(toolHelp32Snapshot, &processEntry32))
        {
            do
            {
                int iLen = 2 * wcslen(processEntry32.szExeFile);
                char* chRtn = new char[iLen + 1];
                //转换成功返回为非负值
                wcstombs(chRtn, processEntry32.szExeFile, iLen + 1);
                if (strcmp(szProcessName, chRtn) == 0)
                {
                    return TRUE;
                }
            } while (Process32Next(toolHelp32Snapshot, &processEntry32));
        }
        CloseHandle(toolHelp32Snapshot);
    }
    //
    return FALSE;
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QSettings sets("sys.ini", QSettings::IniFormat);
    QString exeAbsPath = sets.value(KEY_EXE_PATH).toString();
    if ("" == exeAbsPath) {
        QString exepath = QFileDialog::getOpenFileName(0, "选择程序", "D:/", "Exe files (*.exe)");
        qDebug() << exepath;
        if ("" != exepath) {
            sets.setValue(KEY_EXE_PATH, exepath);
        }
    } else {
       // 检测程序是否还在运行
        while (1) {
            exeAbsPath = sets.value(KEY_EXE_PATH).toString();
            QString exeName = exeAbsPath.split('/').last();
            if (!IsExistProcess(exeName.toStdString().c_str())) {
                QString loginfo;
                loginfo += QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
                loginfo += "|";
                loginfo += exeName;
                loginfo += "|";
                loginfo += "restart\n";
                QFile file("restart_recored.txt");
                file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
                QTextStream out(&file);
                out << loginfo;
                file.close();
                system(exeAbsPath.toStdString().c_str());
            } else {

            }

           Sleep(2000);
        }
       // 关闭状态重启
    }

    return a.exec();
}

3. 完整代码 + 文档 + 执行程序

Windowsexe守护程序-C++文档类资源-CSDN下载

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperYang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值