Qt 设置某项Windows服务的启动方式

原理实际就是调用Windows系统管理服务的程序sc.exe, 然后给出参数。
头文件

#ifndef SERVICECONTROLLER_H
#define SERVICECONTROLLER_H

#include <QObject>
#include <QProcess>
#include <QTextCodec>
#include <QStringList>
#include <QDebug>

#define mDebug(x)     (qDebug()    << "Debug   " + QString(__DATE__).replace(" ",".") + " " + QString(__TIME__) + " " + QString(__FILE__) + " " + QString(__FUNCTION__) + " " + QString::number(__LINE__) + ">>" + " " + x)

class ServiceController : public QObject
{
    Q_OBJECT

public:
    ServiceController(QString serviceName);
    typedef enum{Auto,Manual,Disabled,Delayed_Auto} StartType;//自动、手动、禁用、自动启动(延迟) 
#ifdef Q_OS_WIN
    void start();
    void stop();
    void setStartType(StartType type);
#endif

private:
    QString serviceName;
    QProcess *process;

private slots:
    void readReult();//读取运行结果

};

#endif // SERVICECONTROLLER_H

源文件

#include "servicecontroller.h"

ServiceController::ServiceController(QString serviceName):
    serviceName(serviceName)
{
    process = new QProcess();
    connect(process,SIGNAL(readyRead()),this,SLOT(readReult()));
}

#ifdef Q_OS_WIN
/**
 * @brief ServiceController::setStartType 设置服务的启动类型(需要管理员权限)
 * @param type 服务启动类型
 */
void ServiceController::setStartType(StartType type){
    QStringList args;
    args<<"config"<<serviceName<<"start=";
    switch (type) {
    case Auto:
        process->start("sc",args<<"auto");
        break;
    case Manual:
        process->start("sc",args<<"demand");
        break;
    case Disabled:
        process->start("sc",args<<"disabled");
        break;
    case Delayed_Auto:
        process->start("sc",args<<"delayed-auto");
        break;
    default:
        break;
    }
    process->waitForFinished();
}

void ServiceController::start(){
    process->start("sc",QStringList()<<"start"<<serviceName);
    process->waitForFinished();
}

void ServiceController::stop(){
    process->start("sc",QStringList()<<"stop"<<serviceName);
    process->waitForFinished();
}
#endif

void ServiceController::readReult(){
    QByteArray bytes = process->readAll();
    QTextCodec *gbk = QTextCodec::codecForName("gb2312");
    QString data = gbk->toUnicode(bytes);
    if(!data.isEmpty()){
        mDebug(data);
    }
}


调用方法

        //首先包含头文件
        #include "servicecontroller.h"
        //调用
        ServiceController service("Apache2.4");
        service.setStartType(ServiceController::Manual) //手动启动
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值