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

来源:互联网 发布:php 分割二维数组 编辑:程序博客网 时间:2024/03/29 16:13
/*------------------------------------Author:   Ted--Nefarian ZhuDate:     2011/04/20 03:30Version:  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 serviceBOOL 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 startBOOL 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 startBOOL 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 serviceBOOL 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 serviceBOOL 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 serviceBOOL 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 serviceBOOL 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--------*/


原创粉丝点击