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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值