windows中服务(service)学习

本文详细介绍了在Windows系统中创建和启动服务的过程。首先,通过CreateService()函数在服务数据库中建立服务项并在注册表生成相应数据。然后,使用StartService()函数使服务程序运行起来。文章提供了完整的代码示例,包括如何处理服务已存在和不存在的情况。

感谢 songtzu.

服务程序的编写可以参考:https://www.cnblogs.com/songtzu/p/3543920.html

服务的启动

从服务程序到服务正真运行起来,可以分为两步。一,创建服务;二,启动服务。

创建服务,通过CreateService(***)可以在服务数据库中建立一个新的服务项,还会在注册表生成相应的数据。如果创建成功,可以通过任务管理器查看新建服务。

        注册表数据:

      任务管理器:

 

 

启动服务,服务创建只是生成相应的“配置”数据,服务程序还没有正真运行起来。在之前的基础上调用StartService(***),就可以启动服务了。

完整的启动服务过程:

void LanuchService(char* BinPath)
{
	char ServiceName[] = "MemoryStatus";
	SC_HANDLE     hSCManager = NULL,hService=NULL;
	SERVICE_STATUS  ServiceStatus = { 0 };
	hSCManager=OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);//0XF003F
	if (hSCManager)
	{
		hService = OpenServiceA(hSCManager, ServiceName, SERVICE_ALL_ACCESS);//0XF01FF
		if (hService)
		{//服务已经创建
			printf("Service:%s is created!\n", ServiceName);
			if (QueryServiceStatus(hService, &ServiceStatus))
			{
				if (ServiceStatus.dwCurrentState == SERVICE_STOPPED)
				{
					printf("[+++]service is stopped,let's get it running!\n");
					if (StartServiceA(hService, NULL, NULL))
					{
						printf("service is running now!\n");
					}
				}
			}

		}
		else
		{
			//printf("OpenService fails,error is 0x%x\n", GetLastError());
			if (ERROR_SERVICE_DOES_NOT_EXIST == GetLastError())
			{//服务没有创建
				hService=CreateServiceA(hSCManager,ServiceName,ServiceName,SERVICE_ALL_ACCESS,
					SERVICE_WIN32_SHARE_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,BinPath,
					NULL, NULL, NULL, NULL, NULL);
				if (hService)
				{
					printf("[---]service is created!");
					if (StartServiceA(hService, NULL, NULL))//启动服务
					{
						printf("service is running now!\n");
					}
					else
					{
						printf("start new service fails,error is 0x%x\n", GetLastError());
					}
				}
				else
				{
					printf("CreateServiceA fails,error is 0x%x\n", GetLastError());
				}
			}
		}
	}
	else
	{
		printf("OpenSCManagerA fails,error is 0x%x\n", GetLastError());
	}
	if (hService)
	{
		CloseServiceHandle(hService);
	}
	if (hSCManager)
	{
		CloseServiceHandle(hSCManager);
	}
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值