win系统服务编程c++实现

来源:互联网 发布:c语言是什么语言 编辑:程序博客网 时间:2024/05/17 22:05
#define WIN32_LEAN_AND_MEAN#include <stdio.h>#include <windows.h>#include <winsvc.h>#define SLEEP_TIME 5000#define LOG_FILE "c:\\MemoryWatch.txt"#define SERVICE_NAME "内存查看器2"#define SERVICE_DESC "云守护的系统服务进程2"#define SERVICE_DISPLAY_NAME "云守护的系统服务2"SERVICE_STATUS ServicesStatus;SERVICE_STATUS_HANDLE hStatus;SC_HANDLE scm;SC_HANDLE scv;void ServiceMain(int argc,char ** argv);void ControlHander(DWORD request);void Log(char *str);int startFunc();void Onstart();void OnCreate();void OnDelete();void OnStop();int  main(int argc,char * argv[]){SERVICE_TABLE_ENTRY ServiceTable[2]={{SERVICE_NAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain},{NULL,NULL}};if(argc==2){if(!stricmp(argv[1],"-create")){OnCreate();return 0;}else if(!stricmp(argv[1],"-delete")){OnDelete();return 0;}else if(!stricmp(argv[1],"-start")){Onstart();return 0;}else if(!stricmp(argv[1],"-stop")){OnStop();return 0;}else{printf("invailid parameter\n");return 0;}}printf("Usage:...\n");StartServiceCtrlDispatcher(ServiceTable);return 0;}void Log(char *str){FILE* fp=fopen(LOG_FILE,"a+");if(fp==NULL){printf("error to open file %d\n",GetLastError());return ;}fprintf(fp,"%s\n",str);fclose(fp);}void ServiceMain(int argc,char ** argv){BOOL bRet;int result;bRet=TRUE;ServicesStatus.dwWin32ExitCode=0;ServicesStatus.dwCheckPoint=0;ServicesStatus.dwWaitHint=0;ServicesStatus.dwServiceType=SERVICE_WIN32;ServicesStatus.dwCurrentState=SERVICE_START_PENDING;ServicesStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;ServicesStatus.dwServiceSpecificExitCode=0;hStatus=RegisterServiceCtrlHandler(SERVICE_NAME,(LPHANDLER_FUNCTION)ControlHander);if(hStatus==(SERVICE_STATUS_HANDLE)0){return ;}ServicesStatus.dwCurrentState=SERVICE_RUNNING;SetServiceStatus(hStatus,&ServicesStatus);while(ServicesStatus.dwCurrentState==SERVICE_RUNNING){result=startFunc();if(result){ServicesStatus.dwCurrentState=SERVICE_STOPPED;ServicesStatus.dwWin32ExitCode=-1;SetServiceStatus(hStatus,&ServicesStatus);return ;}}}int startFunc(){MessageBox(NULL,"service running",SERVICE_NAME,MB_OK);return 0;}void ControlHander(DWORD request){switch(request){case SERVICE_CONTROL_STOP:Log("Monitoring stoped.");ServicesStatus.dwWin32ExitCode=0;ServicesStatus.dwCurrentState=SERVICE_STOPPED;SetServiceStatus(hStatus,&ServicesStatus);return ;case SERVICE_CONTROL_SHUTDOWN:Log("Monitoring stoped.");ServicesStatus.dwWin32ExitCode=0;ServicesStatus.dwCurrentState=SERVICE_STOPPED;SetServiceStatus(hStatus,&ServicesStatus);return ;default:break;}SetServiceStatus(hStatus,&ServicesStatus);}void OnCreate(){char filename[MAX_PATH];DWORD dwErrorCode;GetModuleFileName(NULL,filename,MAX_PATH);printf("Creating Service ...");scm=OpenSCManager(0,NULL,SC_MANAGER_ALL_ACCESS);if(scm==NULL){printf("OpenSCManger error:%d\n",GetLastError());return ;}scv=CreateService(scm,SERVICE_NAME,SERVICE_DISPLAY_NAME,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,filename,NULL,NULL,NULL,NULL,NULL);if(scv==NULL){dwErrorCode=GetLastError();if(dwErrorCode!=ERROR_SERVICE_EXISTS){printf("failure !\n");CloseServiceHandle(scm);return;}else{printf("already exists!\n");}}else{printf("Success !\n");CloseServiceHandle(scv);}CloseServiceHandle(scm);scm=scv=NULL;}void OnDelete(){scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);if(scm!=NULL){scv=OpenService(scm,SERVICE_NAME,SERVICE_ALL_ACCESS);if(scv!=NULL){QueryServiceStatus(scv,&ServicesStatus);if(ServicesStatus.dwCurrentState==SERVICE_RUNNING){ControlService(scv,SERVICE_CONTROL_STOP,&ServicesStatus);printf("stop success!\n");}DeleteService(scv);CloseServiceHandle(scv);printf("delete success!\n");}else{printf("OpenService error!\n");}CloseServiceHandle(scm);}else{printf("OpenSCManager error!\n");}scm=scv=NULL;}void Onstart(){DWORD dwErrorCode;printf("starting Service...\n");scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);if(scm!=NULL){scv=OpenService(scm,SERVICE_NAME,SERVICE_ALL_ACCESS);if(scv!=NULL){if(StartService(scv,0,NULL)==0){dwErrorCode=GetLastError();if(dwErrorCode==ERROR_SERVICE_ALREADY_RUNNING){printf("already running !\n");CloseServiceHandle(scv);CloseServiceHandle(scm);return ;}}else{printf("service start success! ...\n");}while(QueryServiceStatus(scv,&ServicesStatus)!=0){if(ServicesStatus.dwCurrentState==SERVICE_START_PENDING){Sleep(100);}else{break;}}CloseServiceHandle(scv);}else{printf("error to open service.,please create the service.\n");}CloseServiceHandle(scm);}else{printf("faile to openscmanger!\n");}scm=scv=NULL;}void OnStop(){scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);if(scm!=NULL){scv=OpenService(scm,SERVICE_NAME,SERVICE_STOP|SERVICE_QUERY_STATUS);if(scv!=NULL){QueryServiceStatus(scv,&ServicesStatus);if(ServicesStatus.dwCurrentState==SERVICE_RUNNING){ControlService(scv,SERVICE_CONTROL_STOP,&ServicesStatus);}CloseServiceHandle(scv);printf("success close service !\n");}else{printf("OpenService error!\n");}CloseServiceHandle(scm);}else{printf("OpenSCManager error!\n");}scm=scv=NULL;}

原创粉丝点击