//Service.c #include <windows.h> SERVICE_STATUS SplSrvServiceStatus; SERVICE_STATUS_HANDLE SplSrvServiceStatusHandle; VOID SvcDebugOut(LPSTR String,DWORD Status); VOID WINAPI SplSrvServiceCtrlHandler(DWORD Opcode); VOID WINAPI SplSrvServiceStart(DWORD argc,LPTSTR *argv); DWORD SplSrvServiceInitialization(DWORD argc,LPTSTR *argv,DWORD *specificError); /******************************************************************/ /* VOID WINAPI SplSrvServiceStart(DWORD argc,LPTSTR *argv) */ VOID WINAPI SplSrvServiceStart(DWORD argc,LPTSTR *argv) { DWORD status; DWORD specificError; //填充 SERVICE_STATUS 结构 SplSrvServiceStatus.dwServiceType = SERVICE_WIN32; SplSrvServiceStatus.dwCurrentState = SERVICE_START_PENDING;//服务在运行 SplSrvServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; SplSrvServiceStatus.dwWin32ExitCode = 0; SplSrvServiceStatus.dwServiceSpecificExitCode = 0; SplSrvServiceStatus.dwCheckPoint = 0; SplSrvServiceStatus.dwWaitHint = 0; //注册服务控制请求处理例程 SplSrvServiceStatusHandle = RegisterServiceCtrlHandler( "Sample_Srv",//SERVICE_WIN32_OWN_PROCESS, SplSrvServiceCtrlHandler ); if (SplSrvServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) { SvcDebugOut(" [SPLSRV_SERVICE] RegisterServiceCtrlHandler " "failed %d/n",GetLastError()); return; } //初始化工作 status = SplSrvServiceInitialization(argc,argv,&specificError); //初始化出错,用户自行修改 if (status!= NO_ERROR) { SplSrvServiceStatus.dwCurrentState = SERVICE_STOPPED; SplSrvServiceStatus.dwCheckPoint = 0; SplSrvServiceStatus.dwWaitHint = 0; SplSrvServiceStatus.dwWin32ExitCode = status; SplSrvServiceStatus.dwServiceSpecificExitCode = specificError; SetServiceStatus(SplSrvServiceStatusHandle,&SplSrvServiceStatus); return; } //初始化完成,设置运行状态 SplSrvServiceStatus.dwCurrentState = SERVICE_RUNNING; SplSrvServiceStatus.dwCheckPoint = 0; SplSrvServiceStatus.dwWaitHint = 0; if (!SetServiceStatus(SplSrvServiceStatusHandle,&SplSrvServiceStatus)) { status = GetLastError(); SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ld/n",status); } //用户自行修改,用于完成服务的工作 SvcDebugOut(" [SPLSRV_SERVICE] Returning the Main Thread /n",0); return; } /************************************************************************/ /* DWORD SplSrvServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError) 功能:初始化 */ /************************************************************************/ DWORD SplSrvServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError) { return (SERVICE_CONTROL_INTERROGATE); } /************************************************************************/ /* VOID WINAPI SplSrvServiceCtrlHandle(DWORD Opcode) 功能: 服务控制请求的处理函数,与 ControlService 函数配合 参数: 服务控制码 */ /************************************************************************/ VOID WINAPI SplSrvServiceCtrlHandler(DWORD Opcode) { DWORD status; switch(Opcode) { case SERVICE_CONTROL_PAUSE: { //完成相关功能 SplSrvServiceStatus.dwCurrentState = SERVICE_PAUSED; break; } case SERVICE_CONTROL_CONTINUE: { //完成相关功能 SplSrvServiceStatus.dwCurrentState = SERVICE_RUNNING; break; } case SERVICE_CONTROL_STOP: { //完成相关功能 SplSrvServiceStatus.dwWin32ExitCode = 0; SplSrvServiceStatus.dwCurrentState = SERVICE_STOPPED; SplSrvServiceStatus.dwCheckPoint = 0; SplSrvServiceStatus.dwWaitHint = 0; if (!SetServiceStatus(SplSrvServiceStatusHandle,&SplSrvServiceStatus)) { status = GetLastError(); SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ld/n",status); } SvcDebugOut(" [SPLSRV_SERVICE] Leaving SplSrvService /n",0); return; } case SERVICE_CONTROL_INTERROGATE: { //收到此请求后发出声响,演示服务控制请求的处理过程 MessageBeep(MB_OK); break; } default: SvcDebugOut(" [SPLSRV_SERVICE] Unrecognized opcode %ld/n",Opcode); } //当前状态 if (!SetServiceStatus(SplSrvServiceStatusHandle,&SplSrvServiceStatus)) { status = GetLastError(); SvcDebugOut(" [SPLSRV_SERVICE] SetServiceStatus error %ld/n",status); } return; } /************************************************************************/ /* void main() */ /************************************************************************/ void main() { //设置SERVICE_TABLE_ENTRY 数据结构,以NULL结束结构 //作为StartServiceCtrlDispatcher 函数的参数 SERVICE_TABLE_ENTRY DispathTable[] = { {"Sample_Srv",(LPSERVICE_MAIN_FUNCTION) SplSrvServiceStart}, {NULL,NULL} }; if (!StartServiceCtrlDispatcher(DispathTable)) { SvcDebugOut(" [SPLSRV_SERVICE] StartServiceCtrlDispatcher (%d)/n" ,GetLastError()); } SplSrvServiceStart(SERVICE_CONTROL_INTERROGATE,"Sample_Srv"); //SplSrvServiceCtrlHandler(SERVICE_CONTROL_INTERROGATE); ControlService(SplSrvServiceStatusHandle,SERVICE_CONTROL_INTERROGATE,&SplSrvServiceStatus); } /************************************************************************/ /* VOID SvcDebugOut(LPSTR String,DWORD Status) 功能:显示信息给调试器 参数:LPSTR String 消息字符串 DWORD Status 状态 */ /************************************************************************/ VOID SvcDebugOut(LPSTR String,DWORD Status) { CHAR Buffer[1024]; if (strlen(String)<1000) { wsprintf(Buffer,String,Status); OutputDebugString(Buffer); } }