c++ 编写windows服务

来源:互联网 发布:splice视频编辑软件 编辑:程序博客网 时间:2024/04/30 08:45

#include <stdio.h>
include <Windows.h>
#include <tchar.h>
TCHAR szServiceName[] = _T("MyTestService");
DWORD dwThreadID;
HANDLE hEvent = INVALID_HANDLE_VALUE;
SERVICE_STATUS status;
SERVICE_STATUS_HANDLE hServiceStatus;
void Init();
BOOL IsServiceInstalled();
BOOL InstallService();
BOOL UninstallService();
BOOL ServiceCtrlStart();
BOOL ServiceCtrlStop();
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);
void LogEvent(LPCTSTR pszFormat, ...);
//Usuage
// Install service:
//TestService.exe /install
// Uninstall service:
//TestService.exe /uninstall
// Start service:
//TestService.exe /start
// Stop service:
//TestService.exe /stop
int main( int argc, char* argv[] )
{
     Init();
     dwThreadID = ::GetCurrentThreadId();
     SERVICE_TABLE_ENTRY st[] =
     {
         { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
         { NULL, NULL }
     };
     LPSTR lpCmdLine = argv[1];
     if ( argc == 2 )
     {
         BOOL bRet;
         if (stricmp(lpCmdLine, "/install") == 0)
         {
              bRet = InstallService();
              if ( bRet == TRUE )
              {
                   printf( "Install service %s success", szServiceName );
              }else
              {
                   printf( "Install service %s failed", szServiceName );
              }
         }
         else if (stricmp(lpCmdLine, "/uninstall") == 0)
         {
              bRet = UninstallService();
              if ( bRet == TRUE )
              {
                   printf( "Uninstall service %s success", szServiceName );
              }else
              {
                   printf( "Uninstall service %s failed", szServiceName );
              }
         }else if (stricmp(lpCmdLine, "/start") == 0)
         {
              bRet = ServiceCtrlStart();
              if ( bRet == TRUE )
              {
                   printf( "Start service %s success", szServiceName );
              }else
              {
                   printf( "Start service %s failed", szServiceName );
              }
         }else if (stricmp(lpCmdLine, "/stop") == 0)
         {
              bRet = ServiceCtrlStop();
              if ( bRet == TRUE )
              {
                   printf( "Stop service %s success", szServiceName );
              }else
              {
                   printf( "Stop service %s failed", szServiceName );
              }
         }
         else
         {
              if (!::StartServiceCtrlDispatcher(st))
              {
                   LogEvent(_T("Register Service Main Function Error!"));
              }
         }
     }else
     {
         if (!::StartServiceCtrlDispatcher(st))
         {
              LogEvent(_T("Register Service Main Function Error!"));
         }
     }
     return 0;
}

//初始化相关结构
void Init()
{
     hServiceStatus = NULL;
     status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
     status.dwCurrentState = SERVICE_STOPPED;
     status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
     status.dwWin32ExitCode = 0;
     status.dwServiceSpecificExitCode = 0;
     status.dwCheckPoint = 0;
     status.dwWaitHint = 0;
}
//服务主线程函数,既用户选择开启服务时调用的函数
void WINAPI ServiceMain()
{
     // Register the control request handler
     status.dwCurrentState = SERVICE_START_PENDING;
     status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
&a, mp;n, bsp;   LogEvent(_T("ServiceMain"));
     //注册服务控制
     hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
     if (hServiceStatus == NULL)
     {
         LogEvent(_T("Handler not installed"));
         return;
     }
     SetServiceStatus(hServiceStatus, &status);
     //如下代码可以为启动服务前的准备工作
     hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );
     if ( hEvent == NULL )
     {
         status.dwCurrentState = SERVICE_STOPPED;
         SetServiceStatus(hServiceStatus, &status);
         LogEvent(_T("Failure to start service"));
         return;
     }
     //
     //更改服务状态为启动
     status.dwWin32ExitCode = S_OK;
     status.dwCheckPoint = 0;
     status.dwWaitHint = 0;
     status.dwCurrentState = SERVICE_RUNNING;
     SetServiceStatus(hServiceStatus, &status);
     //等待用户选择停止服务,
     //当然你也可以把你的服务代码用线程来执行,
     //此时这里只需等待线程结束既可。
     while ( WaitForSingleObject( hEvent, 1000 ) != WAIT_OBJECT_0 )
     {
         //模拟服务的运行,应用时将主要任务放于此即可
         LogEvent(_T("Service runing..."));
     }
     //
     //停止服务
     status.dwCurrentState = SERVICE_STOPPED;
     SetServiceStatus(hServiceStatus, &status);
     LogEvent(_T("Service stopped"));
}
//服务控制函数
void WINAPI ServiceStrl(DWORD dwOpcode)
{
     switch (dwOpcode)
     {
     case SERVICE_CONTROL_STOP:
         status.dwCurrentState = SERVICE_STOP_PENDING;
         SetServiceStatus(hServiceStatus, &status);
         //告诉服务线程停止工作
         ::SetEvent( hEvent );
         LogEvent(_T("want to stopped Service"));
         break;
     case SERVICE_CONTROL_PAUSE:
         break;
     case SERVICE_CONTROL_CONTINUE:
         break;
     case SERVICE_CONTROL_INTERROGATE:
         break;
     case SERVICE_CONTROL_SHUTDOWN:
         break;
     default:
         LogEvent(_T("Bad service request"));
     }
}
//判断服务是否已安装
BOOL IsServiceInstalled()
{
     BOOL bResult = FALSE;
     //打开服务控制管理器
     SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
     if (hSCM != NULL)
     {
         //打开服务
         SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
         if (hService != NULL)
         {
              bResult = TRUE;
              ::CloseServiceHandle(hService);
         }
         ::CloseServiceHandle(hSCM);
     }
     return bResult;
}
//安装服务
BOOL InstallService()
{
     if (IsServiceInstalled())
         return TRUE;
     //打开服务控制管理器
     SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
     if (hSCM == NULL)
     {
         return FALSE;
     }
     // Get the executable file path
     TCHAR szFilePath[MAX_PATH];
     ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
     //创建服务
     SC_HANDLE hService = ::CreateService(
         hSCM,
         szServiceName,
         szServiceName,
         SERVICE_ALL_ACCESS,
         SERVICE_WIN32_OWN_PROCESS,
         SERVICE_AUTO_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动
         SERVICE_ERROR_NORMAL,
         szFilePath,
         NULL,
         NULL,
         _T(""),
         NULL,
         NULL);
     if (hService == NULL)
     {
         ::CloseServiceHandle(hSCM);
         return FALSE;
     }
     ::CloseServiceHandle(hService);
     ::CloseServiceHandle(hSCM);
     return TRUE;
}
//删除服务
BOOL UninstallService()
{
     if (!IsServiceInstalled())
         return TRUE;
     SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
     if (hSCM == NULL)
     {
         return FALSE;
     }
     SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
     if (hService == NULL)
     {
         ::CloseServiceHandle(hSCM);
         return FALSE;
     }
     SERVICE_STATUS status;
     ::ControlService(hService, SERVICE_CONTROL_STOP, &status);
     //删除服务
     BOOL bDelete = ::DeleteService(hService);
     ::CloseServiceHandle(hService);
     ::CloseServiceHandle(hSCM);
     if (bDelete)
         return TRUE;
     LogEvent(_T("Service could not be deleted"));
     return FALSE;
}
//开启服务
BOOL ServiceCtrlStart()
{
     BOOL bRet;
     SC_HANDLE hSCM;
     SC_HANDLE hService;
     hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
     if (hSCM!=NULL)
     {
         hService=OpenService( hSCM, szServiceName, SERVICE_START);
         if (hService!=NULL)
         {
              //开始Service
              bRet = StartService(hService,0,NULL);
              CloseServiceHandle(hService);
         }else
         {
              bRet = FALSE;
         }
         CloseServiceHandle(hSCM);
     }else
     {
         bRet = FALSE;
     }
     return bRet;
}
//停止服务
BOOL ServiceCtrlStop()
{
     BOOL bRet;
     SC_HANDLE hSCM;
     SC_HANDLE hService;
     SERVICE_STATUS ServiceStatus;
     hSCM=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
     if (hSCM!=NULL)
     {
         hService=OpenService( hSCM, szServiceName, SERVICE_STOP|SERVICE_QUERY_STATUS );
         if (hService!=NULL)
         {
              QueryServiceStatus( hService, &ServiceStatus );
              if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
              {
                   bRet = ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus );
              }else
              {
                   bRet = FALSE;
              }
              CloseServiceHandle( hService );
         }else
         {
              bRet = FALSE;
         }
         CloseServiceHandle( hSCM );
     }else
     {
         bRet = FALSE;
     }
     return bRet;
}
//记录日记
void LogEvent(LPCTSTR pFormat, ...)
{
     TCHAR    chMsg[256];
     HANDLE hEventSource;
     LPTSTR lpszStrings[1];
     va_list pArg;
     va_start(pArg, pFormat);
     _vstprintf(chMsg, pFormat, pArg);
     va_end(pArg);
     lpszStrings[0] = chMsg;
     hEventSource = RegisterEventSource(NULL, szServiceName);
     if (hEventSource != NULL)
     {
         ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
         DeregisterEventSource(hEventSource);
     }
}

 

 

原创粉丝点击