windows服务程序框架.doc_第1页
windows服务程序框架.doc_第2页
windows服务程序框架.doc_第3页
windows服务程序框架.doc_第4页
windows服务程序框架.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*Usage:*1)Add service.cpp to project workspace*2)Change the ServiceName under the global variable*to desire name*3)Add your function into ServiceThread()*4)DONE!*Install:*1)Use command prompt.*2)Locate the exe.*3)Type -iInstall*Type -uUninstall*Type HELPFor more*/#include #include #include static struct ErrEntry int code;const char* msg; ErrList = / /library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp 0,No error , 1055,The service database is locked. , 1056,An instance of the service is already running. , 1060, The service does not exist as an installed service. , 1061,The service cannot accept control messages at this time. , 1062, The service has not been started. , 1063, The service process could not connect to the service controller. , 1064,An exception occurred in the service when handling the control request. , 1065,The database specified does not exist. , 1066,The service has returned a service-specific error code. , 1067,The process terminated unexpectedly. , 1068,The dependency service or group failed to start. , 1069,The service did not start due to a logon failure. , 1070,After starting, the service hung in a start-pending state. , 1071,The specified service database lock is invalid. , 1072, The service marked for deletion. , 1073, The service already exists. , 1078,The name is already in use as either a service name or a service display name. ,;const int nErrList = sizeof(ErrList) / sizeof(ErrEntry);/ Global /FILE*pLog;char*ServiceName = ServiceTest;/ Name of the serviceHANDLEterminateEvent = NULL;/ Event used to hold ServerMain from completing/ Handle used to communicate status info with / the SCM. Created by RegisterServiceCtrlHandlerHANDLEthreadHandle = 0;/ Thread for the actual workBOOLpauseService = FALSE;/ Flags holding current state of serviceBOOLrunningService = FALSE;/SERVICE_STATUS_HANDLE serviceStatusHandle;/DWORDWINAPI ServiceThread( LPDWORD lParam);BOOLInitService();BOOLSendStatusToSCM(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint, DWORD dwWaitHint);voidResumeService(); /重启服务voidPauseService(); /暂停服务voidStopService(); /停止服务voidterminate(DWORD error);voidServiceCtrlHandler(DWORD controlCode);voidServiceMain(DWORD argc, LPTSTR *argv);voidErrorHandler(char *s, int err);voidGetStatus(SC_HANDLE service);voidShowUsage();/ service config program tasksboolInstallService(); /安装服务程序boolUninstallService(); /卸载服务程序boolGetConfiguration();boolChangeConfig();/ service control program tasksboolServiceRun(); /启动服务boolServiceControl(char* CONTROL);void main(int argc, char *argv)SERVICE_TABLE_ENTRY serviceTable = ServiceName, (LPSERVICE_MAIN_FUNCTION) ServiceMain, NULL, NULL;BOOL success;if(argc = 2)if (stricmp(-i, argv1) = 0)InstallService();else if (stricmp(-u, argv1) = 0)UninstallService();else if (stricmp(-r, argv1) = 0)ServiceRun();else if (stricmp(-s, argv1) = 0)ServiceControl(STOP);else if (stricmp(-p, argv1) = 0)ServiceControl(PAUSE);else if (stricmp(-c, argv1) = 0)ServiceControl(RESUME);else if (stricmp(status, argv1) = 0)SC_HANDLE scm, service;/Open connection to SCMscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (!scm)ErrorHandler(OpenSCManager, GetLastError();/Get services handleservice = OpenService(scm, ServiceName, SERVICE_ALL_ACCESS);if (!service)ErrorHandler(OpenService, GetLastError();cout STATUS: ;GetStatus(service);else if (stricmp(config, argv1) = 0)GetConfiguration();else if (stricmp(help, argv1) = 0)ShowUsage();/add other custom commands here and /update ShowUsage functionelseShowUsage();else /register with SCMsuccess = StartServiceCtrlDispatcher(serviceTable);if (!success)ErrorHandler(StartServiceCtrlDispatcher,GetLastError();void ServiceMain(DWORD argc, LPTSTR *argv)BOOL success;/immediately call registration function serviceStatusHandle = RegisterServiceCtrlHandler(ServiceName, (LPHANDLER_FUNCTION)ServiceCtrlHandler);if (!serviceStatusHandle)terminate(GetLastError();return;/notify SCMsuccess = SendStatusToSCM(SERVICE_START_PENDING, NO_ERROR, 0 , 1, 5000);if (!success) terminate(GetLastError();return;/create termination eventterminateEvent = CreateEvent (0, TRUE, FALSE, 0);if (!terminateEvent)terminate(GetLastError();return;/notify SCMsuccess = SendStatusToSCM(SERVICE_START_PENDING, NO_ERROR, 0 , 2, 1000);if (!success) terminate(GetLastError();return;/*/check for startup parameterif (argc = 2)else*/notify SCMsuccess = SendStatusToSCM(SERVICE_START_PENDING, NO_ERROR, 0 , 3, 5000);if (!success) terminate(GetLastError();return;/start servicesuccess = InitService();if (!success) terminate(GetLastError();return;/notify SCM service is runnningsuccess = SendStatusToSCM(SERVICE_RUNNING, NO_ERROR, 0 , 0, 0);if (!success) terminate(GetLastError();return;/wait for stop signal and then terminateWaitForSingleObject(terminateEvent, INFINITE);terminate(0);DWORD WINAPI ServiceThread(LPDWORD lParam) /服务功能函数while (true)FILE *f1;f1 = fopen(c:okhelper.txt,a+);if ( f1 = NULL)printf(Open File Fail.n);exit(0);fprintf(f1,I am okhelper.n);fclose(f1);Sleep(5000);return 0;/initialises the service by starting its threadBOOL InitService()DWORD id;/ Start the services threadthreadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ServiceThread,NULL,0,&id);if (threadHandle = 0)return FALSE;elserunningService = TRUE;return TRUE;/resumes paused servicevoid ResumeService()pauseService = FALSE;ResumeThread(threadHandle);/pauses servicevoid PauseService()pauseService = TRUE;SuspendThread(threadHandle);/stops service by allowing ServiceMain to completevoid StopService()runningService = FALSE;/set the event that is holding ServiceMainSetEvent(terminateEvent);/this function consolidates the activities of updating/the service status with SetServiceStatusBOOL SendStatusToSCM(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint, DWORD dwWaitHint)BOOL success;SERVICE_STATUS serviceStatus;/fill in all of the SERVICE_STATUS fieldsserviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;serviceStatus.dwCurrentState = dwCurrentState;/if in the process of something, then accept/no control events, else accept anythingif (dwCurrentState = SERVICE_START_PENDING)serviceStatus.dwControlsAccepted = 0;elseserviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE |SERVICE_ACCEPT_SHUTDOWN;/if a specific exit code is defines, set up the win32 exit code properlyif (dwServiceSpecificExitCode = 0)serviceStatus.dwWin32ExitCode = dwWin32ExitCode;elseserviceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;serviceStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode;serviceStatus.dwCheckPoint = dwCheckPoint;serviceStatus.dwWaitHint = dwWaitHint;success = SetServiceStatus (serviceStatusHandle, &serviceStatus);if (!success)StopService();return success;void ServiceCtrlHandler(DWORD controlCode)DWORD currentState = 0;BOOL success;switch(controlCode)/ START = ServiceMain()/ STOPcase SERVICE_CONTROL_STOP:currentState = SERVICE_STOP_PENDING;/notify SCMsuccess = SendStatusToSCM(SERVICE_STOP_PENDING,NO_ERROR,0,1,5000);/stop serviceStopService();return;/ PAUSEcase SERVICE_CONTROL_PAUSE:if (runningService & !pauseService)/notify SCMsuccess = SendStatusToSCM(SERVICE_PAUSE_PENDING,NO_ERROR,0,1,1000);PauseService();currentState = SERVICE_PAUSED;break;/ RESUMEcase SERVICE_CONTROL_CONTINUE:if (runningService & pauseService)/notify SCMsuccess = SendStatusToSCM(SERVICE_CONTINUE_PENDING,NO_ERROR,0,1,1000);ResumeService();currentState = SERVICE_RUNNING;break;/ UPDATEcase SERVICE_CONTROL_INTERROGATE:/update status out of switch()break;case SERVICE_CONTROL_SHUTDOWN:/do nothingreturn;default:break;/notify SCM current stateSendStatusToSCM(currentState, NO_ERROR, 0, 0, 0);/handle an error from ServiceMain by cleaning up and tell SCM service didnt start.void terminate(DWORD error)/close event handleif (terminateEvent)CloseHandle(terminateEvent);/notify SCM service stoppedif (serviceStatusHandle)SendStatusToSCM(SERVICE_STOPPED, error, 0, 0, 0);/close thread handleif (threadHandle)CloseHandle(threadHandle);void ErrorHandler(char *s, int err)cout s failed endl;cout Error ( err ): ;int i;for (i = 0; i nErrList; +i) if (ErrListi.code = err) cout ErrListi.msg;break;if (i = nErrList) cout unknown error;cout endl;pLog = fopen(server.log,a);fprintf(pLog, %s failed, error code = %dn,s , err); fclose(pLog);ExitProcess(err);void ShowUsage()cout endl;cout USAGE: endl;cout server -itInstall service endl;cout server -utUninstall service endl;cout server -rtRun service endl;cout server -stStop service endl;cout server -ptPause service endl;cout server -ctResume service endl;cout server statustCurrent status endl;cout endl;/ Purpose:Install service into SCM./ Parameter:N/A/ Returns:N/A/bool InstallService()SC_HANDLE newService;SC_HANDLE scm; char szBuffer255;char szPathMAX_PATH;/get file pathGetModuleFileName( GetModuleHandle(NULL), szPath, MAX_PATH );strcpy( szBuffer, );strcat( szBuffer, szPath );strcat( szBuffer, );/open connection to SCMscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);if (!scm)ErrorHandler(OpenSCManager, GetLastError();/install servicenewService = CreateService(scm,/scm databaseServiceName,/service nameServiceName,/display nameSERVICE_ALL_ACCESS,/access rights to the serviceSERVICE_WIN32_OWN_PROCESS,/service typeSERVICE_AUTO_START,/service start typeSERVICE_ERROR_NORMAL,/error control typeszBuffer,/service pathNULL,/no load ordering group NULL,/no tag identifierNULL,/no dependenciesNULL,/LocalSystem accountNULL);/no passwordif(!newService)ErrorHandler(CreateService, GetLastError();return false;elsecout Service Installed endl;ServiceRun();/clean upCloseServiceHandle(newService);CloseServiceHandle(scm);return true;/ Purpose:Uninstall service from SCM./ Parameter:N/A/ Returns:N/A/bool UninstallService()SC_HANDLE service;SC_HANDLE scm;BOOL SUCCESS;SERVICE_STATUS status;/Open connection to SCMscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);if (!scm)ErrorHandler(OpenSCManager, GetLastError();/Get services handleservice = OpenService(scm, ServiceName, SERVICE_ALL_ACCESS | DELETE);if (!service)ErrorHandler(OpenService, GetLastError();/Get service statusSUCCESS= QueryServiceStatus(service, &status);if (!SUCCESS)ErrorHandler(QueryServiceStatus, GetLastError();/Stop service if necessaryif (status.dwCurrentState != SERVICE_STOPPED)cout Stopping service. endl;SUCCESS = ControlService(service, SERVICE_CONTROL_STOP, &status);if (!SUCCESS)ErrorHandler(ControlService, GetLastError();Sleep(500);/Delete serviceSUCCESS = DeleteService(service);if (SUCCESS)cout Service Uninstalled endl;elseErrorHandler(DeleteService, GetLastError();/Clean upCloseServiceHandle(service);CloseServiceHandle(scm);return true;/ Purpose:Run service/ Parameter:N/A/ Returns:N/A/bool ServiceRun() SC_HANDLE scm, Service;SERVICE_STATUS ssStatus; DWORD dwOldCheckPoint; DWORD dwStartTickCount;DWORD dwWaitTime;DWORD dwStatus;/open connection to SCMscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (!scm)ErrorHandler(OpenSCManager, GetLastError();/open serviceService = OpenService(scm, ServiceName, SERVICE_ALL_ACCESS);if(!Service)ErrorHandler(OpenService, GetLastError();return false;else/start serviceStartService(Service, 0, NULL);GetStatus(Service);/ Check the status until the service is no longer start pending. if (!QueryServiceStatus( Service, &ssStatus) )ErrorHandler(QueryServiceStatus, GetLastError();/ Save the tick count and initial checkpoint.dwStartTickCount = GetTickCount();dwOldCheckPoint = ssStatus.dwCheckPoint;while (ssStatus.dwCurrentState = SERVICE_START_PENDING) / Do not wait longer than the wait hint. A good interval is / one tenth the wait hint, but no less than 1 second and no / more than 10 seconds. dwWaitTime = ssStatus.dwWaitHint / 10;if( dwWaitTime 10000 )dwWaitTime = 10000;Sleep( dwWaitTime );/ Check the status again. if (!QueryServiceStatus(Service, &ssStatus) )break; if ( ssStatus.dwCheckPoint dwOldCheckPoint )/ The service is making progress.dwStartTickCount = GetTickCount();dwOldCheckPoint = ssStatus.dwCheckPoint;elseif(GetTickCount()-dwStartTickCount ssStatus.dwWaitHint)/ No progress made within the wait hintbreak;if (ssStatus.dwCurrentState = SERVICE_RUNNING) GetStatus(Service);dwStatus = NO_ERROR;else cout nService not started. endl;cout Current State: ssStatus.dwCurrentState endl; cout Exit Code: ssStatus.dwWin32ExitCode endl; cout Service Specific Exit Code: ssStatus.dwServiceSpecificExitCode endl; cout Check Point: ssStatus.dwCheckPoint endl; cout Wait Hint: ssStatus.dwWaitHint endl;dwStatus = GetLastError(); CloseServiceHandle(scm);CloseServiceHandle(Service); return true;/ Purpose:Control service (STOP, PAUSE, CONTINUE)./ Parameter:N/A/ Returns:N/A/bool ServiceControl(char* CONTROL)SC_HANDLE service;SC_HANDLE scm;BOOL SUCCESS;SERVICE_STATUS status;/Open connection to SCMscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (!scm)ErrorHandler(OpenSCManager, GetLastError();/Get services handleservice = OpenService(scm, ServiceName, SERVICE_ALL_ACCESS);if (!service)ErrorHandler(OpenService, GetLastError();/stop the serviceif (stricmp(CONTROL, STOP) = 0)cout Service is stopping. endl;SUCCESS = ControlService(service, SERVICE_CONTROL_STOP, &status);/pause the serviceelse if (stricmp(CONTROL, PAUSE) = 0)cout Service is pausing. endl;SUCCESS = ControlService(service, SERVICE_CONTROL_PAUSE, &status);/continue the serviceelse if (stricmp(CONTROL, RESUME) = 0)cout Service is resuming. endl;SUCCESS = ControlService(service, SERVICE_CONTROL_CONTINUE, &status);if (!SUCCESS)ErrorHandler(ControlService, GetLastError();elseGetStatus(service);/Clean upCloseServiceHandle(service);CloseServiceHandle(scm);return true;/ Purpose:Get the current status of the service/ Param

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论