C++ 后台服务程序

以下为网上收录的一个可用的c++后台服务代码。

附上个人的理解:

main里面主要做创建、移除、暂停和继续操作,操作做完之后,main函数就结束掉了(本例只有创建和移除操作,移除后需要重启,服务才会消失)。

如果是创建操作的话,创建完之后main结束点,但仍然会有一段服务器代码继续运行,如本例中的StartService函数里,创建了一个线程,执行具体操作。

暂停和继续操作可以是,结束掉这个线程和创建一个线程。


#include "windows.h"
#include <ctime>
using namespace std;
//全局变量
SERVICE_STATUS      ServiceStatus;
SERVICE_STATUS_HANDLE ServiceStatusHandle;
TCHAR szServiceName[] = _T("junkFilter");
 
//函数声明
void InstallService(char *szServicePath);
void removeService();
void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv);
void WINAPI ServiceControl(DWORD dwCode);
DWORD WINAPI Service(LPVOID lpvThread);      //服务功能函数
 
 
int main(int argc, char* argv[])
{     
    //定义SERVICE_TABLE_ENTRY DispatchTable[] 结构
    SERVICE_TABLE_ENTRY DispatchTable[2] =
    {
       {TEXT(szServiceName), ServiceStart},                 
       {NULL, NULL}
    };

    //安装或者打开服务
    StartServiceCtrlDispatcher(DispatchTable);

    if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/")))
    {
        if(_stricmp("install",argv[1]+1)==0)
        {
          InstallService(argv[0]);
        }
        else if(_stricmp("remove",argv[1]+1)==0)
        {
          removeService();
        }
        else
        {             
            printf("%s - install to install the service \n",szServiceName);
            printf("%s - remove to remove the service \n",szServiceName);  
        }
    }
    
    return 0;
}
//函数定义
void InstallService(char *szServicePath)
{
     SC_HANDLE        schSCManager;
     SC_HANDLE        schService;     
     SERVICE_STATUS      InstallServiceStatus;
     DWORD      dwErrorCode;
    
     //打开服务管理数据库
     schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
     if(schSCManager == NULL)
     {
               //Open Service Control Manager Database Failed!;
         return;
     }
     //创建服务
     schService = CreateService(     
                                                  schSCManager,
                             TEXT(szServiceName),
                             TEXT(szServiceName),
                             SERVICE_ALL_ACCESS,
                             SERVICE_WIN32_OWN_PROCESS,
                             SERVICE_AUTO_START,
                             SERVICE_ERROR_IGNORE,
                             szServicePath,
                             NULL,
                             NULL,
                             NULL,
                             NULL,
                             NULL);
     if(schService == NULL)
     {
           dwErrorCode = GetLastError();
           if(dwErrorCode != ERROR_SERVICE_EXISTS)
           {
                 //创建服务失败
                 CloseServiceHandle(schSCManager);
                 return;
           }
           else
           {
                 //要创建的服务已经存在
                 schService = OpenService(schSCManager, TEXT(szServiceName), SERVICE_START);
                 if(schService == NULL)
                 {
                       //Open Service Failed!;
                       CloseServiceHandle(schSCManager);
                       return;
                 }
           }
     }
     else
     {
           //Create Service Success!;
     }
     //启动服务
     if(StartService(schService, 0, NULL)==0 )
     {
           //启动失败
           dwErrorCode = GetLastError();
           if(dwErrorCode == ERROR_SERVICE_ALREADY_RUNNING)
           {
                 //Service already run!;
                 CloseServiceHandle(schSCManager);
                 CloseServiceHandle(schService);
                 return ;
           }
     }
     else
     {
           //Service pending
     }
 
     while(QueryServiceStatus(schService, &InstallServiceStatus) != 0)
     {
           if(InstallServiceStatus.dwCurrentState == SERVICE_START_PENDING)
           {
                 //Sleep(100);
           }
           else
           {
                 break;
           }
     }
     if(InstallServiceStatus.dwCurrentState != SERVICE_RUNNING)
     {
           //Failure!
     }
     else
     {
           //Sucess!
     }
 
     //擦屁股
     CloseServiceHandle(schSCManager);
     CloseServiceHandle(schService);
     return;
}
//停止和删除已安装的服务程序
void removeService()
{
     SC_HANDLE schService;
     SC_HANDLE schSCManager;
     //打开服务管理数据库
     schSCManager=OpenSCManager(
                       NULL,    //本地计算机
                       NULL,    //默认的数据库
                       SC_MANAGER_ALL_ACCESS //要求所有的访问权
                       );
     if(schSCManager)
     {
         //获取服务程序句柄
         schService=OpenService(
              schSCManager,          //服务管理数据库句柄
              TEXT(szServiceName),   //服务名
              SERVICE_ALL_ACCESS     //响应所有的访问请求
              );
         if(schService)
         {
              //试图停止服务
              if(ControlService(
                   schService,                 //服务程序句柄
                   SERVICE_CONTROL_STOP, //停止服务请求码
                   &ServiceStatus              //接收最后的服务状态信息
                   ))
              {
                   _tprintf(TEXT("Stopping %s."),TEXT(szServiceName));
                   Sleep(1000);
 
                   //等待服务停止
                   //
                   while(QueryServiceStatus(schService,&ServiceStatus))
                   {
                       if(SERVICE_STOP_PENDING==ServiceStatus.dwCurrentState)
                       {
                            _tprintf(TEXT("."));
                            Sleep(1000);
                       }
                       else
                            break;
                   }
                   if(SERVICE_STOPPED==ServiceStatus.dwCurrentState)
                       _tprintf(TEXT("\n %s stopped. \n"),TEXT(szServiceName));
                   else
                       _tprintf(TEXT("\n %s failed to stopp. \n"),TEXT(szServiceName));
              }
              //删除已安装的服务程序安装
              if(DeleteService(schService))
                   _tprintf(TEXT("%s removed. \n"),TEXT(szServiceName));
              else
                _tprintf(TEXT("DeleteService failed - %s. \n"), GetLastError());
              CloseServiceHandle(schService);
         }
         else
              _tprintf(TEXT("OpenService failed - %s \n"),GetLastError());
         CloseServiceHandle(schSCManager);
     }
     else
         _tprintf(TEXT("OpenSCManager failed - %s \n"),GetLastError());
} 
void WINAPI ServiceStart(DWORD dwArgc,LPTSTR *lpArgv)
{
     HANDLE hThread;
 
     ServiceStatus.dwServiceType      = SERVICE_WIN32;
     ServiceStatus.dwCurrentState      = SERVICE_START_PENDING;
     ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP      | SERVICE_ACCEPT_PAUSE_CONTINUE;
    
     ServiceStatus.dwServiceSpecificExitCode      = 0;
     ServiceStatus.dwWin32ExitCode            = 0;
     ServiceStatus.dwCheckPoint            = 0;
     ServiceStatus.dwWaitHint            = 0;
 
     ServiceStatusHandle = RegisterServiceCtrlHandler(TEXT(szServiceName), ServiceControl);
     if(ServiceStatusHandle == 0)
     {
           //error
           return;
     }
 
     ServiceStatus.dwCurrentState      = SERVICE_RUNNING;
     ServiceStatus.dwCheckPoint      = 0;
     ServiceStatus.dwWaitHint      = 0;
 
     if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0)
     {
           //SetServiceStatus error!
           return;
     }
    
     //创建服务线程   服务完成的功能在这里调用
     hThread = CreateThread(NULL,
                       0,
                       Service,
                       NULL,
                       0,
                       NULL);
     if(hThread == NULL)
     {
           //CreateThread error!
           return;
     }
     CloseHandle(hThread);
     return;
}
 
//服务控制模块
 
void WINAPI ServiceControl(DWORD dwCode)
{
     switch(dwCode) {
     case SERVICE_CONTROL_PAUSE:
           ServiceStatus.dwCurrentState      = SERVICE_PAUSED;
           break;
 
     case SERVICE_CONTROL_CONTINUE:
           ServiceStatus.dwCurrentState      = SERVICE_RUNNING;
           break;
 
     case SERVICE_CONTROL_STOP:
           ServiceStatus.dwCurrentState      = SERVICE_STOPPED;
           ServiceStatus.dwWin32ExitCode      = 0;
           ServiceStatus.dwCheckPoint      = 0;
           ServiceStatus.dwWaitHint      = 0;
           if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0)
           {
                 //SetServiceStatus error!
           }
           return;
     case SERVICE_CONTROL_INTERROGATE:
           break;
     default:
           break;
     }
 
     if(SetServiceStatus(ServiceStatusHandle, &ServiceStatus) == 0)
     {
           //SetServiceStatus error!
     }
 
     return ;
}
 
//服务线程函数
DWORD WINAPI Service(LPVOID lpvThread)
{
    CJunkAnalyse junk;
    time_t preUpdateTime = time(NULL)-junk.m_dbMinsAppend*60;

    time_t preInsertTime = time(NULL)-junk.m_dbMinsAppend*60;


    while(1)
    {
        time_t curTime = time(NULL);
        if ((curTime-preUpdateTime)>junk.m_dbMinsAppend*60)
        {
            preUpdateTime = time(NULL);
            // 获取新数据
            junk.appendChatLog();
        }
        else
        {
            Sleep(5000);            
        }

        if ((curTime-preInsertTime)>junk.m_dbMinsJudge*60)
        {
            preInsertTime = time(NULL);
            // 获取新数据
            junk.insertJunkChat();
        }
        else
        {
            Sleep(5000);            
        }
    }

       return 1;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值