我寫的WINDOWS服務操作類-----非常適合初學者

/*------------------------------------
Author:   Ted--Nefarian Zhu
Date:     2011/04/20 03:30
Version:  V1.00 All rights reserved !
Life sucks,but we all have to move on!
------------------------------------*/
#ifndef CSERV_H_H
#define CSERV_H_H
#include <windows.h>

class CServ
{
private:
     SC_HANDLE m_hSC, m_hSvc;
     SERVICE_STATUS m_status;
     LPQUERY_SERVICE_CONFIG m_config;
     DWORD m_dwNeeded;             
      
public:
     CServ();
     ~CServ();
     BOOL OpenServ(const char* servname);               
     BOOL AutoServ(const char* servname); 
     BOOL DemandServ(const char* servname);
     BOOL DisableServ(const char* servname); 
     BOOL CheckServ(const char* servname,
          char buff[],int buffsize);
     BOOL StartServ(const char* servname);   
     BOOL StopServ(const char* servname);    
};


CServ::CServ()
{
    m_hSC = NULL;
    m_hSvc = NULL;
    memset(&m_status, 0, sizeof(SERVICE_STATUS));  
    memset(&m_config, 0, sizeof(LPQUERY_SERVICE_CONFIG));
    m_dwNeeded = 0;         
}


CServ::~CServ() 
{   
    if (m_hSvc != NULL)  CloseServiceHandle(m_hSvc);
    if (m_hSC != NULL)  CloseServiceHandle(m_hSC);            
}


//Open the specified service
BOOL CServ::OpenServ(const char* servname)
{
    m_hSC = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
    
    if (m_hSC == NULL)
    {             
         return FALSE;         
    }
    
    m_hSvc = OpenService(m_hSC, servname, SERVICE_ALL_ACCESS|DELETE);
    
    if (m_hSvc == NULL)
    {
         CloseServiceHandle(m_hSC);     
         return FALSE;      
    } 
    
    return TRUE; 
}


//Make the specified service auto start
BOOL CServ::AutoServ(const char* servname)
{
    assert(m_hSvc != NULL);   
    m_config = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, 4096);
    BOOL isSuccess = QueryServiceConfig(m_hSvc, m_config, 4096, &m_dwNeeded);
    
    if (!isSuccess)  return FALSE;
    
    if (m_config->dwStartType != SERVICE_AUTO_START)
    {
        isSuccess = ChangeServiceConfig(m_hSvc, SERVICE_NO_CHANGE,
                       SERVICE_AUTO_START, SERVICE_NO_CHANGE,
                       NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    }
    
    if (!isSuccess)   return FALSE; 
    return TRUE;
}


//Make the specified service demand start
BOOL CServ::DemandServ(const char* servname)
{
    assert(m_hSvc != NULL);   
    m_config = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, 4096);
    BOOL isSuccess = QueryServiceConfig(m_hSvc, m_config, 4096, &m_dwNeeded);
    
    if (!isSuccess)   return FALSE;
    if (m_config->dwStartType != SERVICE_DEMAND_START)
    {
        isSuccess = ChangeServiceConfig(m_hSvc, SERVICE_NO_CHANGE,
                    SERVICE_DEMAND_START, SERVICE_NO_CHANGE,
                        NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    }
    if (!isSuccess)   return FALSE;   
    return TRUE;
}


//Disable the specified service
BOOL CServ::DisableServ(const char* servname)
{
    assert(m_hSvc != NULL);    
    m_config = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, 4096);
    BOOL isSuccess = QueryServiceConfig(m_hSvc,m_config,4096,&m_dwNeeded);
    
    if (!isSuccess)  return FALSE;
    
    if (m_config->dwStartType != SERVICE_DISABLED)
    {
        isSuccess = ChangeServiceConfig(m_hSvc, SERVICE_NO_CHANGE,
                            SERVICE_DISABLED, SERVICE_NO_CHANGE,
                            NULL,NULL,NULL,NULL,NULL,NULL,NULL);
    }
    if (!isSuccess)    return FALSE;  
    return TRUE;
}


//Check the status of the specified service
BOOL CServ::CheckServ(const char* servname,char buff[],int buffsize)
{
    assert(m_hSvc != NULL);   
    m_config = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR,4096);
    BOOL isSuccess = QueryServiceConfig(m_hSvc,m_config,4096,&m_dwNeeded);
    
    if (!isSuccess)    return FALSE;
    
    if (m_config->dwStartType == SERVICE_AUTO_START)
         memcpy(buff,"SERVICE_AUTO_START",sizeof("SERVICE_AUTO_START"));
    else if (m_config->dwStartType == SERVICE_DEMAND_START)
         memcpy(buff,"SERVICE_DEMAND_START",sizeof("SERVICE_DEMAND_START"));
    else if (m_config->dwStartType == SERVICE_DEMAND_START)
         memcpy(buff,"SERVICE_DISABLED",sizeof("SERVICE_DISABLED"));     
        
    if(QueryServiceStatus(m_hSvc,&m_status) == FALSE) return FALSE;
    
    if( m_status.dwCurrentState == SERVICE_RUNNING)
    {
        strcat(buff," SERVICE_RUNNING");
        return TRUE;
    } 
    else if(m_status.dwCurrentState == SERVICE_STOPPED)  
    {
        strcat(buff," SERVICE_STOPPED");
        return TRUE;
    }  
    else return FALSE;  
}


//Start the specified service
BOOL CServ::StartServ(const char* servname)
{
    assert(m_hSvc != NULL);
    if(QueryServiceStatus(m_hSvc,&m_status) == FALSE) return FALSE;
    // start the service
    if(StartService( m_hSvc, 0, NULL) == FALSE) return FALSE;
    // wait until the service is started
    while(QueryServiceStatus(m_hSvc, &m_status) == TRUE)
    {
        Sleep(1000);                      
        if( m_status.dwCurrentState == SERVICE_RUNNING)
        {
            return TRUE;
        }
    }         
}


//Stop the specified service
BOOL CServ::StopServ(const char* servname)
{
    assert(m_hSvc != NULL);
    if(QueryServiceStatus(m_hSvc,&m_status) == FALSE)  return FALSE;    
    // stop the service
    if(ControlService(m_hSvc,SERVICE_CONTROL_STOP,&m_status)==FALSE)
    {
        return FALSE;
    }
    // wait until the service is stoped
    while(QueryServiceStatus(m_hSvc, &m_status) == TRUE)
    {
        Sleep(1000);                      
        if( m_status.dwCurrentState == SERVICE_STOPPED)
        {
            return TRUE;
        }
    }
}



#endif        /*-------CSERV_H_H--------*/






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值