创建服务demo

本文详细介绍了一个Windows服务的创建过程,包括使用C++实现的服务代码,以及如何通过SCM注册、启动、停止服务。代码示例展示了如何响应系统关机、停止、暂停等控制命令,并记录服务状态到日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建服务demo
1.sc create myservice_service_service binPath= “E:\code\system2user\Debug\myservice.exe” type= own start= auto
执行上面语句生成一个新服务。
2.服务相关代码如下:

//#include “stdafx.h”
#include <stdio.h>
#include
#include <windows.h>

using namespace std;

#define SLEEP_TIME 5000 //间隔时间

#define FILE_PATH “C:\log.txt” //信息输出文件

bool brun=false;

SERVICE_STATUS servicestatus;

SERVICE_STATUS_HANDLE hstatus;

int WriteToLog(char* str);

void WINAPI ServiceMain(int argc, char** argv);

void WINAPI CtrlHandler(DWORD request);

int InitService();

int WriteToLog(char* str)
{

FILE* pfile;
fopen_s(&pfile,FILE_PATH,"a+");
if (pfile==NULL)
{
	return -1;
}
fprintf_s(pfile,"%s\n",str);
fclose(pfile);
return 0;

}

void WINAPI ServiceMain(int argc, char** argv)
{
servicestatus.dwServiceType = SERVICE_WIN32;
servicestatus.dwCurrentState = SERVICE_START_PENDING;
servicestatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE;//在本例中只接受系统关机、停止、暂停服务两种控制命令
servicestatus.dwWin32ExitCode = 0;
servicestatus.dwServiceSpecificExitCode = 0;
servicestatus.dwCheckPoint = 0;
servicestatus.dwWaitHint = 0;

hstatus = ::RegisterServiceCtrlHandler("serviceDemo", CtrlHandler);

if (hstatus==0)

{

	WriteToLog("RegisterServiceCtrlHandler failed");
	return;

}

WriteToLog("RegisterServiceCtrlHandler success");

//向SCM 报告运行状态

servicestatus.dwCurrentState = SERVICE_RUNNING;

SetServiceStatus (hstatus, &servicestatus);

//下面就开始任务循环了,你可以添加你自己希望服务做的工作

brun=true;

MEMORYSTATUS memstatus;

char str[100];

memset(str,'\0',100);

while (brun)
{
	GlobalMemoryStatus(&memstatus);
	int availmb=memstatus.dwAvailPhys/1024/1024;
	sprintf_s(str,100,"available memory is %dMB",availmb);
	WriteToLog(str);
	Sleep(SLEEP_TIME);
}

}

void WINAPI CtrlHandler(DWORD request)
{
switch (request)
{
case SERVICE_CONTROL_STOP:
brun=false;
servicestatus.dwCurrentState = SERVICE_STOPPED;
WriteToLog(“service stopped”);
break;

case SERVICE_CONTROL_SHUTDOWN:
	brun=false;
	servicestatus.dwCurrentState = SERVICE_STOPPED;
	WriteToLog("service stopped");
	break;

case SERVICE_CONTROL_PAUSE:
	brun=false;
	servicestatus.dwCurrentState = SERVICE_PAUSED;
	WriteToLog("service paused");
	break;

case SERVICE_CONTROL_CONTINUE:
	brun=true;
	servicestatus.dwCurrentState = SERVICE_CONTINUE_PENDING;
	WriteToLog("service continue");
	break;

default:
	break;
}

SetServiceStatus (hstatus, &servicestatus);

}

int main(int argc, char* argv[])
{
SERVICE_TABLE_ENTRY entrytable[2];

entrytable[0].lpServiceName= "serviceDemo";

entrytable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;

entrytable[1].lpServiceName=NULL;

entrytable[1].lpServiceProc=NULL;

StartServiceCtrlDispatcher(entrytable);

return 0;

}
3.常用指令
sc 服务名 start 开始服务
sc 服务名 stop 停止服务
sc 服务名 pause 暂停服务
sc 服务名 continue 继续服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值