#include <stdi o.h>#include <Windows.h>#include <tchar.h>TCHAR szServ iceN ame[] = _T("My TestSer v ice"); DWORD dwThreadID;HANDLE hEvent = INVALID_HANDLE_VALUE; SERVICE_STATUS s tatus;SERVICE_STATUS_HANDLE hServ iceStatus;v oi d Init();BOOL IsSer v iceInstalled();BOOL InstallSer v ice();BOOL U ninstallSer v ice();BOOL Ser v iceCtrlStart();BOOL Ser v iceCtrlStop();v oi d WINAPI Ser v iceMai n();v oi d WINAPI Ser v iceStrl(DWORD dwOpc ode); v oi d LogEv ent(LPCTSTR pszFormat, ...);//Usuage// Ins tall ser v ice://TestServ ic e.exe /i nstall// Uninstall ser v ice://TestServ ic e.exe /unins tall// Start ser v ice://TestServ ic e.exe /s tart// Stop s erv ic e://TestServ ic e.exe /s topint main( int argc, char* argv[] ){Init();dwT hreadID = ::GetCurrentThreadId();SERVICE_TABLE_ENTRY st[] ={{ szServ ic eName, (LPSERVICE_MAIN_FUNCTION)Serv ic eMain }, { NULL, NULL }};LPSTR lpC mdLine = argv[1];if ( argc == 2 ){BOOL bRet;if (stricmp(lpCmdLine, "/ins tall") == 0){bRet = InstallSer v ice();if ( bRet == TRUE ){printf( "Ins tall ser v ice %s succ ess", szServ ic eName );}else{printf( "Ins tall ser v ice %s failed", sz Ser v iceName );}}els e if (stricmp(lpCmdLine, "/uninstall") == 0){bRet = Uni nstallServ ic e();if ( bRet == TRUE ){printf( "Uninstall ser v ice %s succ ess", szServ ic eName ); }else{printf( "Uninstall ser v ice %s failed", szServ ic eName );}}else if (stricmp(lpC mdLine, "/start") == 0){bRet = Ser v iceCtrlStart();if ( bRet == TRUE ){printf( "Start ser v ice %s succ ess", szServ ic eName );}else{printf( "Start ser v ice %s fail ed", sz Ser v iceName );}}else if (stricmp(lpC mdLine, "/stop") == 0){bRet = Ser v iceCtrlStop();if ( bRet == TRUE ){printf( "Stop s er v ice %s s uccess", szSer v iceN ame );}else{printf( "Stop s er v ice %s failed", szServ iceN ame );}}els e{if (!::StartSer v iceCtrlDispatc her(st)){LogEv ent(_T("Register Ser v ice Main Function Error!")); }}}else{if (!::StartSer v iceCtrlDispatc her(st)){LogEv ent(_T("Register Ser v ice M ain Function Error!"));}}return 0;}//初始化相关结构v oi d Init(){hSer v iceStatus = NULL;status.dwServ ic eT y pe = SERVICE_WIN32_OWN_PROC ESS; status.dwCurrentState = SERVIC E_STOPPED;status.dwControlsAcc epted = SERVICE_ACCEPT_STOP;status.dwWi n32Ex itCode = 0;status.dwServic eSpecificEx itCode = 0;status.dwChec k Poi nt = 0;status.dwWaitHint = 0;}//服务主线程函数,既用户选择开启服务时调用的函数v oi d WINAPI Ser v iceMai n(){// Register the c ontrol r equest handlerstatus.dwCurrentState = SERVIC E_ST ART_PENDING;status.dwControlsAcc epted = SERVICE_ACCEPT_STOP;&a, mp;n, bsp; LogEv ent(_T("Ser v iceMai n"));//注册服务控制hSer v iceStatus = RegisterServ ic eCtrlHandler(szSer v iceN ame, Ser v iceStrl); if (hSer v iceStatus == NULL){LogEv ent(_T("Handl er not installed"));return;}SetSer v iceStatus(hSer v iceStatus, &status);//如下代码可以为启动服务前的准备工作hEv ent = ::CreateEv ent( NULL, TRUE, FALSE, NULL );if ( hEv ent == NULL ){status.dwCurrentState = SERVICE_STOPPED;SetServ ic eStatus(hSer v iceStatus, &status);LogEv ent(_T("Failure to start ser v ice"));return;}////更改服务状态为启动status.dwWi n32Ex itCode = S_OK;status.dwChec k Poi nt = 0;status.dwWaitHint = 0;status.dwCurrentState = SERVIC E_RUNNING;SetSer v iceStatus(hSer v iceStatus, &status);//等待用户选择停止服务,//当然你也可以把你的服务代码用线程来执行,//此时这里只需等待线程结束既可。
while ( WaitF orSingleObj ect( hEv ent, 1000 ) != WAIT_OBJ ECT_0 ) {//模拟服务的运行,应用时将主要任务放于此即可LogEv ent(_T("Ser v ice runing..."));}////停止服务status.dwCurrentState = SERVIC E_STOPPED;SetSer v iceStatus(hSer v iceStatus, &status);LogEv ent(_T("Ser v ice s topped"));}//服务控制函数v oi d WINAPI Ser v iceStrl(DWORD dwOpc ode){s witch (dwOpc ode){c ase SERVICE_CONTROL_STOP:status.dwCurrentState = SERVICE_STOP_PENDING; SetServ ic eStatus(hSer v iceStatus, &status);//告诉服务线程停止工作::SetEv ent( hEv ent );LogEv ent(_T("want to s topped Ser v ice"));br eak;c ase SERVICE_CONTROL_PAUSE:br eak;c ase SERVICE_CONTROL_CONTINUE:br eak;c ase SERVICE_CONTROL_INTERROGATE:br eak;c ase SERVICE_CONTROL_SHUTDOWN:br eak;default:LogEv ent(_T("Bad ser v ice r equest"));}}//判断服务是否已安装BOOL IsSer v iceInstalled(){BOOL bRes ult = FALSE;//打开服务控制管理器SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (hSCM != NULL){//打开服务SC_HANDLE hServ ice = ::OpenSer v ice(hSCM, szSer v iceN ame, SERVICE_QUERY_CONFIG); if (hSer v ice != NULL){bResult = TRUE;::CloseSer v iceHandle(hSer v ice);}::Clos eServ ic eHandle(hSCM);}return bResult;}//安装服务BOOL InstallSer v ice(){if (Is Ser v iceInstalled())return TRUE;//打开服务控制管理器SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (hSCM == NULL){return FALSE;}// Get the ex ec utable file pathTCHAR szFilePath[MAX_PATH];::GetM odul eFileName(NULL, szFilePath, MAX_PATH);//创建服务SC_HANDLE hServ ic e = ::CreateSer v ice(hSCM,szServ ic eName,szServ ic eName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START, //如果为SERVIC E_DEMAND_ST ART则表示此服务需手工启动 SERVICE_ERROR_NORMAL,szFilePath,NULL,NULL,_T(""),NULL,NULL);if (hSer v ice == NULL){::Clos eServ ic eHandle(hSCM);return FALSE;}::CloseServ ic eHandle(hSer v ice);::CloseServ ic eHandle(hSCM);return TRUE;}//删除服务BOOL U ninstallSer v ice(){if (!IsSer v iceInstalled())return TRUE;SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (hSCM == NULL){return FALSE;}SC_HANDLE hServ ic e = ::OpenSer v ice(hSCM, szServ iceN ame, SERVICE_STOP | DELETE); if (hSer v ice == NULL){::Clos eServ ic eHandle(hSCM);return FALSE;}SERVICE_STATUS status;::Contr olSer v ice(hSer v ice, SERVICE_CONTROL_STOP, &status);//删除服务BOOL bDelete = ::DeleteServ ic e(hSer v ice);::CloseServ ic eHandle(hSer v ice);::CloseServ ic eHandle(hSCM);if (bD elete)return TRUE;LogEv ent(_T("Ser v ice c ould not be deleted"));}//开启服务BOOL Ser v iceCtrlStart(){BOOL bRet;SC_HANDLE hSCM;SC_HANDLE hServ ic e;hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT); if (hSCM!=NULL){hSer v ice=OpenSer v ice( hSCM, szSer v iceN ame, SERVICE_START); if (hSer v ice!=NULL){//开始Ser v icebRet = StartSer v ice(hServ ic e,0,NULL);Clos eSer v iceH andl e(hServ ice);}else{bRet = FALSE;}CloseSer v iceHandl e(hSCM);}else{bR et = FALSE;}}//停止服务BOOL Ser v iceCtrlStop(){BOOL bRet;SC_HANDLE hSCM;SC_HANDLE hServ ic e;SERVICE_STATUS Ser v iceStatus;hSCM=OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );if (hSCM!=NULL){hSer v ice=OpenSer v ice( hSCM, szSer v iceN ame, SERVICE_STOP|SERVICE_QU ERY_ST ATUS ); if (hSer v ice!=NULL){Quer y Serv ic eStatus( hSer v ice, &Ser v iceStatus );if (Serv ic eStatus.dwCurrentState == SERVICE_RUNNING){bRet = C ontrolSer v ice( hSer v ice, SERVICE_CONTROL_STOP, &Serv ic eStatus );}else{bRet = F ALSE;}Clos eSer v iceH andl e( hServ ic e );}else{bRet = FALSE;}CloseSer v iceHandl e( hSCM );}else{bR et = FALSE;}return bRet;}//记录日记v oi d LogEv ent(LPCTSTR pFormat, ...){TCHAR chMsg[256];HANDLE hEv entSource;LPTSTR lpsz Strings[1];va_list pArg;va_start(pArg, pFor mat);_v stprintf(chMsg, pFormat, pArg);va_end(pArg);lpsz Strings[0] = c hMsg;hEv entSource = RegisterEv entSource(NULL, szServ iceN ame);if (hEv entSource != NULL){ReportEvent(hEv entSource, EVENTLOG_INFORMATION_T YPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL); DeregisterEventSource(hEventSource);}}。