QT开启服务

如何使用QT来开启一个服务呢?

新建一个QT工程,添加如下代码:

#include <windows.h>
#include <string>

/*******************************************
* 函数:StartServiceExistByName
* 参数:strDestServiceName
* 功能:判断服务状态并启动
* 返回值:
* TRUE  服务启动成功
* FALSE 服务启动失败
********************************************/
bool StartServiceByName(std::string strDestServiceName)
{
    bool bServiceStatus = FALSE;
    SC_HANDLE schSCManager  =  NULL ;
    SC_HANDLE schService    =  NULL ;
    SERVICE_STATUS_PROCESS ssStatus;
    DWORD dwBytesNeeded     =  0 ;
    char szSvcName[MAX_PATH] = {0};
    memcpy_s(szSvcName,MAX_PATH,strDestServiceName.c_str(),strDestServiceName.length());
    // Get a handle to the SCM database.
    schSCManager = OpenSCManager(
        NULL ,                                 // local computer
        NULL ,                                 // ServicesActive database
        SC_MANAGER_ALL_ACCESS);               // full access rights

    if  ( NULL  == schSCManager)
    {
        //LOG(level_error, "OpenSCManager failed (%d)" , GetLastError());
        return bServiceStatus;
    }

    // Get a handle to the service.
    schService = OpenServiceA(
        schSCManager,                       // SCM database
        szSvcName,                          // name of service
        SERVICE_ALL_ACCESS/* | DELETE*/);      // full access

    if  (schService ==  NULL )
    {
        //LOG(level_error, "OpenService failed (%d)" , GetLastError());
        CloseServiceHandle(schSCManager);
        return bServiceStatus;
    }
    if  (!QueryServiceStatusEx(
        schService,                          // handle to service
        SC_STATUS_PROCESS_INFO,              // information level
        (LPBYTE) &ssStatus,                  // address of structure
        sizeof (SERVICE_STATUS_PROCESS),      // size of structure
        &dwBytesNeeded ) )                   // size needed if buffer is too small
    {
        //LOG(level_error, "QueryServiceStatusEx failed (%d)" , GetLastError());
        CloseServiceHandle(schService);
        CloseServiceHandle(schSCManager);
        return bServiceStatus;
    }
    else
    {
        switch (ssStatus.dwCurrentState)
        {
        case  SERVICE_STOPPED:
        case  SERVICE_STOP_PENDING:
            //LOG(level_info, "%s Service status is Stop ", szSvcName);
            break ;
        case  SERVICE_PAUSED:
        case  SERVICE_PAUSE_PENDING:
            //LOG(level_info, "%s Service status is Pause ", szSvcName);
            break ;
        case  SERVICE_CONTINUE_PENDING:
        case  SERVICE_RUNNING:
        case  SERVICE_START_PENDING:
            //LOG(level_info, "%s Service status is Running ", szSvcName);
            bServiceStatus = TRUE;
            break ;
        }
    }
    if (bServiceStatus == FALSE)
    {
        StartService(schService,0,NULL);
        Sleep(500);
        //LOG(level_error, "StartService failed (%d)" , GetLastError());
        // 获得服务的当前状态
        QueryServiceStatusEx(schService,SC_STATUS_PROCESS_INFO,(LPBYTE) &ssStatus,sizeof (SERVICE_STATUS_PROCESS),&dwBytesNeeded );
        if (SERVICE_RUNNING == ssStatus.dwCurrentState)
        {
            bServiceStatus = TRUE;
        }
    }
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    return bServiceStatus;
}

调用起来很简单:

StartServiceByName("XXX");

其中 XXX 是服务名,应该取下图任务管理器中红框那一列的名字

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的C++应用程序开发框架,它可以在Windows操作系统上开发和运行服务应用程序。在Windows上开发Qt服务应用程序的过程中,我们通常会使用Qt的相关模块和库来实现。 首先,我们需要创建一个Qt服务应用程序项目。可以在Qt Creator中选择一个合适的项目模板来创建一个新的项目。然后,我们可以使用Qt的相关类和函数来编写服务应用程序的逻辑。例如,可以使用QCoreApplication类来创建服务应用程序的主循环,并使用QTimer类来定期执行某些任务。 在Windows上运行Qt服务应用程序时,我们需要将其作为一个Windows服务进行安装和启动。Windows提供了一系列的命令行工具来帮助我们管理和操作服务,例如sc和net命令。可以使用这些工具来创建、安装、启动、停止和删除服务。 在Qt中,可以使用QProcess类来调用命令行工具。通过在程序中调用相关命令行工具,可以实现安装和启动服务的操作。例如,可以使用QProcess::start()函数来启动一个命令行工具,并传递相应的参数。 需要注意的是,在Windows上运行服务应用程序时,需要特殊的权限和设置。例如,服务应用程序通常以系统用户身份运行,因此需要确保用户拥有足够的权限来执行相关任务。另外,服务应用程序需要以无界面模式运行,并且需要确保它在操作系统启动时自动启动。 总之,Qt可以用于开发和运行Windows服务应用程序。通过使用Qt的相关模块和类,以及调用Windows提供的命令行工具,可以实现服务应用程序的创建、安装和启动等操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值