您现在的位置是:首页 > 编程 > 

Windows服务编程

2025-07-27 20:40:15
Windows服务编程 我们看到有什么60主动防御服务,Google更新服务等,我们也写个简单的服务吧代码语言:javascript代码运行次数:0运行复制#include <stdio.h> #include <windows.h> //毫秒 #define SLEEP_TIME 1000 #define FILE_PATH "D:\\test.txt&qu

Windows服务编程

我们看到有什么60主动防御服务,Google更新服务等,我们也写个简单的服务吧

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
#include <windows.h>

//毫秒
#define SLEEP_TIME 1000
#define FILE_PATH "D:\\"
//服务状态
SERVICE_STATUS m_ServiceState;
//服务状态句柄
SERVICE_STATUS_HADLE m_ServiceHandle;
void WIAPI ServiceMain(int argc, char** ar);
void WIAPI ServiceCtrlHandler(DWORD Opcode);
int WriteToLog(char* str);
BOOL bRunning;

int main() {

	SERVICE_TABLE_ETRY stentry[2];
	stentry[0].lpServiceame = "demo";
	stentry[0].lpServiceProc = (LPSERVICE_MAI_FUCTIOA)ServiceMain;
	//服务的最后一项要设置为ULL
	stentry[1].lpServiceame = ULL;
	stentry[1].lpServiceProc = ULL;

	StartServiceCtrlDispatcher(stentry);
	//system("pause");
	return 0;
}

//服务主函数
void WIAPI ServiceMain(int argc, char** ar) {
	MEMORYSTATUS memstatus;
	char str[100];
	int availMem;

	//服务类型和状态
	m_ServiceState.dwServiceType = SERVICE_WI2;
	m_ServiceState.dwCurrentState = SERVICE_START_PEDIG;
	m_ServiceState.dwControlsAccepted = SERVICE_COTROL_SHUTDOW | SERVICE_COTROL_STOP;
	m_ServiceState.dwWin2ExitCode = 0;
	m_ServiceState.dwServiceSpecificExitCode = 0;
	//下面这两个基本不需要,除非服务启动时间很长
	m_ServiceState.dwCheckPoint = 0;
	m_ServiceState.dwWaitHint = 0;

	//注册服务控制函数
	m_ServiceHandle = RegisterServiceCtrlHandler("demo", (LPHADLER_FUCTIO)ServiceCtrlHandler);
	if (m_ServiceHandle == ULL) {
		WriteToLog("RegisterServiceCtrlHandler failed");
		return;
	}
	WriteToLog("RegisterServiceCtrlHandler success");

	//更新服务状态
	m_ServiceState.dwCurrentState = SERVICE_RUIG;
	SetServiceStatus(m_ServiceHandle, &m_ServiceState);


	memset(str, '\0', 100);
	bRunning = TRUE;
	while (bRunning)
	{
		GlobalMemoryStatus(&memstatus);
		availMem = memstatus.dwAvailVirtual / 1024 / 1024;
		sprintf_s(str, 50 ,"available memory is %d MB, use %d %%", availMem, memstatus.dwMemoryLoad);
		WriteToLog(str);
		Sleep(SLEEP_TIME);

	}
	WriteToLog("service stop!");
}

//服务控制函数(启动,暂停等)
void WIAPI ServiceCtrlHandler(DWORD Opcode) {
	switch (Opcode)
	{
	case SERVICE_COTROL_STOP:
		bRunning = FALSE;
		m_ServiceState.dwCurrentState = SERVICE_STOPPED;
		break;
	case SERVICE_COTROL_SHUTDOW:
		bRunning = FALSE;
		m_ServiceState.dwCurrentState = SERVICE_STOPPED;
		break;
	default:
		break;
	}
	SetServiceStatus(m_ServiceHandle, &m_ServiceState);
}

int WriteToLog(char * str)
{
	FILE* pFile;
	fopen_s(&pFile, FILE_PATH, "a+");
	fprintf_s(pFile, "%s\n", str);
	fclose(pFile);
	return 0;
}

编译并生成后可以用sc命令安装

代码语言:javascript代码运行次数:0运行复制
sc create giantbranchDemo binpath= D:\

我们再打开服务即可看到

我们可以直接在上面的图形界面启动,也可以sc启动

启动停止与删除命令

代码语言:javascript代码运行次数:0运行复制
sc start 
sc stop
sc delete

如果程序本身自带启动和删除可以使用下面的:

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
#include <windows.h>

//毫秒
#define SLEEP_TIME 1000
#define FILE_PATH "C:\\"
#define SERVICEAME "practice"
//服务状态
SERVICE_STATUS m_ServiceState;
//服务状态句柄
SERVICE_STATUS_HADLE m_ServiceHandle;
void WIAPI ServiceMain(int argc, char** ar);
void WIAPI ServiceCtrlHandler(DWORD Opcode);
int WriteToLog(char* str);
BOOL InstallService();
void DelService();
BOOL bRunning;

int main(int argc, char** ar[]) {
	SERVICE_TABLE_ETRY stentry[2];
	if (argc == 2)
	{
		if (!strcmp(ar[1], "-i"))
		{
			InstallService();
		}else if (!strcmp(ar[1], "-d"))
		{
			DelService();
		}
		return 0;
	}

	stentry[0].lpServiceame = SERVICEAME;
	stentry[0].lpServiceProc = (LPSERVICE_MAI_FUCTIOA)ServiceMain;
	//服务的最后一项要设置为ULL
	stentry[1].lpServiceame = ULL;
	stentry[1].lpServiceProc = ULL;

	StartServiceCtrlDispatcher(stentry);
	return 0;
}

//服务主函数
void WIAPI ServiceMain(int argc, char** ar) {
	MEMORYSTATUS memstatus;
	char str[100];
	int availMem;

	//服务类型和状态
	m_ServiceState.dwServiceType = SERVICE_WI2;
	m_ServiceState.dwCurrentState = SERVICE_START_PEDIG;
	m_ServiceState.dwControlsAccepted = SERVICE_COTROL_SHUTDOW | SERVICE_COTROL_STOP;
	m_ServiceState.dwWin2ExitCode = 0;
	m_ServiceState.dwServiceSpecificExitCode = 0;
	//下面这两个基本不需要,除非服务启动时间很长
	m_ServiceState.dwCheckPoint = 0;
	m_ServiceState.dwWaitHint = 0;

	//注册服务控制函数
	m_ServiceHandle = RegisterServiceCtrlHandler(SERVICEAME, (LPHADLER_FUCTIO)ServiceCtrlHandler);
	if (m_ServiceHandle == ULL) {
		WriteToLog("RegisterServiceCtrlHandler failed");
		return;
	}
	WriteToLog("RegisterServiceCtrlHandler success");

	//更新服务状态
	m_ServiceState.dwCurrentState = SERVICE_RUIG;
	SetServiceStatus(m_ServiceHandle, &m_ServiceState);


	memset(str, '\0', 100);
	bRunning = TRUE;
	GlobalMemoryStatus(&memstatus);
	availMem = memstatus.dwAvailVirtual / 1024 / 1024;
	sprintf_s(str, 50, "available memory is %d MB, use %d %%", availMem, memstatus.dwMemoryLoad);
	WriteToLog(str);
	WriteToLog("service is Running!");
}

//服务控制函数(启动,暂停等)
void WIAPI ServiceCtrlHandler(DWORD Opcode) {
	switch (Opcode)
	{
	case SERVICE_COTROL_STOP:
	case SERVICE_COTROL_SHUTDOW:
		bRunning = FALSE;
		m_ServiceState.dwWin2ExitCode = 0;
		m_ServiceState.dwCurrentState = SERVICE_STOPPED;
		break;
	default:
		break;
	}
	SetServiceStatus(m_ServiceHandle, &m_ServiceState);
}

int WriteToLog(char * str)
{
	FILE* pFile;
	fopen_s(&pFile, FILE_PATH, "a+");
	fprintf_s(pFile, "%s\n", str);
	fclose(pFile);
	return 0;
}

BOOL InstallService()
{
	char strDir[1024];
	SC_HADLE scHandler,schService;
	LPCTSTR lpszBinaryPathame;
	//GetCurrentDirectory(1024, strDir);
	GetModuleFileame(ULL, strDir, 1024);
	printf("%s\n", strDir);
	lpszBinaryPathame = strDir;
	scHandler = OpenSCManager(ULL, ULL, SC_MAAGER_ALL_ACCESS);
	if (scHandler == ULL)
	{
		printf("open scmanager failed! May be you don't have the privilage?");
	}
	schService = CreateService(scHandler, SERVICEAME, SERVICEAME,
		SERVICE_ALL_ACCESS,
		SERVICE_WI2_OW_PROCESS,
		SERVICE_AUTO_START,
		SERVICE_ERROR_ORMAL,
		lpszBinaryPathame,
		ULL,
		ULL,
		ULL,
		ULL,
		ULL
		);
	if (schService == ULL)
	{
		printf("create service failed~");
		return FALSE;
	}
	CloseServiceHandle(schService);
	CloseServiceHandle(scHandler);
	return TRUE;
}

void DelService()
{
	SC_HADLE scHandler;
	SC_HADLE schService;
	SERVICE_STATUS status;
	BOOL isSuccess;
	DWORD errCode;
	
	scHandler = OpenSCManager(ULL, ULL, SC_MAAGER_ALL_ACCESS);
	if (scHandler == ULL)
	{
		printf("open scmanager failed! May be you don't have the privilage?");
		return;
	}
	schService = OpenService(scHandler, SERVICEAME, SC_MAAGER_ALL_ACCESS | DELETE);
	if (schService == ULL)
	{
		errCode = GetLastError();
		printf("OpenService failed! code:%d\n", errCode);
		return;
	}
	isSuccess = QueryServiceStatus(schService, &status);
	if (!isSuccess)
	{
		printf("QueryServiceStatus failed!");
		return;
	}
	if (status.dwCurrentState != SERVICE_STOPPED)
	{
		isSuccess = ControlService(schService, SERVICE_COTROL_STOP, &status);
		if (!isSuccess)
		{
			printf("Stop Service failed!");
			return;
		}
	}
	isSuccess = DeleteService(schService);
	if (!isSuccess)
	{
		printf("DeleteService failed");
		return;
	}
	else {
		printf("DeleteService success");
	}
	CloseServiceHandle(scHandler);
	CloseServiceHandle(schService);

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2018-01-20,如有侵权请联系 cloudcommunity@tencent 删除service编程服务函数windows

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1207601.html

相关标签:无
上传时间: 2025-07-24 14:23:12
留言与评论(共有 8 条评论)
本站网友 安置房有房产证吗
1秒前 发表
SC_MAAGER_ALL_ACCESS); if (scHandler == ULL) { printf("open scmanager failed! May be you don't have the privilage?"); return; } schService = OpenService(scHandler
本站网友 白茯苓
24分钟前 发表
bRunning = FALSE; m_ServiceState.dwWin2ExitCode = 0; m_ServiceState.dwCurrentState = SERVICE_STOPPED; break; default
本站网友 美然动力街区二手房
10分钟前 发表
SC_MAAGER_ALL_ACCESS | DELETE); if (schService == ULL) { errCode = GetLastError(); printf("OpenService failed! code:%d\n"
本站网友 中日钓鱼岛
23分钟前 发表
暂停等) void WIAPI ServiceCtrlHandler(DWORD Opcode) { switch (Opcode) { case SERVICE_COTROL_STOP
本站网友 胡萝卜汁的作用
1秒前 发表
ULL
本站网友 阳光丽景二手房
2分钟前 发表
暂停等) void WIAPI ServiceCtrlHandler(DWORD Opcode) { switch (Opcode) { case SERVICE_COTROL_STOP
本站网友 琅琊阁
6分钟前 发表
bRunning = FALSE; m_ServiceState.dwWin2ExitCode = 0; m_ServiceState.dwCurrentState = SERVICE_STOPPED; break; default