现在的位置: 首页 > 综合 > 正文

VC SDK windows服务程序

2013年12月03日 ⁄ 综合 ⁄ 共 7754字 ⁄ 字号 评论关闭

#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;

}

//

抱歉!评论已关闭.