C语言编写Windows服务程序

简介: 原文: C语言编写Windows服务程序 #include #include #define SLEEP_TIME 5000 // 间隔时间 #define LOGFILE "C:\\memstatus.
原文: C语言编写Windows服务程序

#include <Windows.h>
#include <stdio.h>

#define SLEEP_TIME 5000                          // 间隔时间
#define LOGFILE "C:\\memstatus.txt"              // 信息输出文件


SERVICE_STATUS ServiceStatus;  // 服务状态
SERVICE_STATUS_HANDLE hStatus; // 服务状态句柄

void  ServiceMain(int argc, char** argv);
void  CtrlHandler(DWORD request);
int InitService();

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

// Service initialization
int InitService() 
{ 
	OutputDebugString("Monitoring started.");
	int result;
	result = WriteToLog("Monitoring started.");
	return(result); 
}
// Control Handler
void  CtrlHandler(DWORD request)
{
	switch (request)
	{
	case SERVICE_CONTROL_STOP:
		OutputDebugString("Monitoring stopped.");
		WriteToLog("Monitoring stopped.");

		ServiceStatus.dwWin32ExitCode = 0; 
		ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
		SetServiceStatus (hStatus, &ServiceStatus);
		return;
	case SERVICE_CONTROL_SHUTDOWN:
		OutputDebugString("Monitoring stopped.");
		WriteToLog("Monitoring stopped.");

		ServiceStatus.dwWin32ExitCode = 0; 
		ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
		SetServiceStatus (hStatus, &ServiceStatus);
		return;
	default:
		break;
	}
	// Report current status
	SetServiceStatus (hStatus, &ServiceStatus);
	return;
}

void  ServiceMain(int argc, char** argv)
{
	int error;
	ServiceStatus.dwServiceType = 
		SERVICE_WIN32;
	ServiceStatus.dwCurrentState = 
		SERVICE_START_PENDING;
	ServiceStatus.dwControlsAccepted = 
		SERVICE_ACCEPT_SHUTDOWN | 
		SERVICE_ACCEPT_STOP;//在本例中只接受系统关机和停止服务两种控制命令
	ServiceStatus.dwWin32ExitCode = 0;
	ServiceStatus.dwServiceSpecificExitCode = 0;
	ServiceStatus.dwCheckPoint = 0;
	ServiceStatus.dwWaitHint = 0;
	hStatus = ::RegisterServiceCtrlHandler(
		"MemoryStatus", 
		(LPHANDLER_FUNCTION)CtrlHandler);
	if (hStatus == (SERVICE_STATUS_HANDLE)0)
	{
		WriteToLog("RegisterServiceCtrlHandler failed");
		return;
	}
	WriteToLog("RegisterServiceCtrlHandler success");
	// Initialize Service 
	error = InitService();
	if (error) 
	{
		// Initialization failed
		ServiceStatus.dwCurrentState = 
			SERVICE_STOPPED; 
		ServiceStatus.dwWin32ExitCode = -1; 
		SetServiceStatus(hStatus, &ServiceStatus); 
		return; 
	} 
	// 向SCM 报告运行状态
	ServiceStatus.dwCurrentState = 
		SERVICE_RUNNING;
	SetServiceStatus (hStatus, &ServiceStatus);
	
	// 下面就开始任务循环了,你可以添加你自己希望服务做的工作
	MEMORYSTATUS memstatus;
	while (ServiceStatus.dwCurrentState == 
		SERVICE_RUNNING)
	{
		char buffer[16];
		GlobalMemoryStatus(&memstatus);
		int availmb = memstatus.dwAvailPhys/1024/1024;
		sprintf_s(buffer,100,"available memory is %dMB",availmb);
		OutputDebugString(buffer);
		int result = WriteToLog(buffer);
		if (result)
		{
			ServiceStatus.dwCurrentState = 
				SERVICE_STOPPED; 
			ServiceStatus.dwWin32ExitCode      = -1; 
			SetServiceStatus(hStatus, 
				&ServiceStatus);
			return;
		}
		Sleep(SLEEP_TIME);
	}
	WriteToLog("service stopped");
}



void main()
{
	SERVICE_TABLE_ENTRY ServiceTable[2];
	ServiceTable[0].lpServiceName="MemoryStatus";
	ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
	ServiceTable[1].lpServiceName=NULL;
	ServiceTable[1].lpServiceProc=NULL;
	StartServiceCtrlDispatcher(ServiceTable);

}

 

命令行操作:


 

 

注意我这里在sc create MemortyStatus binpath= D:\MemoryStatus.exe里面有个拼写错误,MemoryStatus写成了MemortyStatus,多了个t,这个没关系,只要你在下面操作时候将错就错就行了。

运行结果:

 

最后,停止和删除服务:

 

参考:

http://www.vckbase.com/index.php/wv/1193

http://www.2cto.com/kf/201111/111990.html

目录
相关文章
|
3月前
|
Windows
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
120 2
|
4月前
|
Windows
Windows下版本控制器(SVN)-启动服务器端程序
Windows下版本控制器(SVN)-启动服务器端程序
119 4
|
5月前
|
安全 Devops 测试技术
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
98 0
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
|
8月前
|
安全 JavaScript Java
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
104 12
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
|
7月前
|
Windows
Windows程序的数字签名证书怎么申请
Windows程序的数字签名证书申请流程包括:准备企业资料(营业执照、税务登记证等),提交申请表及企业资料。经过初审、实名认证和二审后,等待1-5个工作日审核结果。审核通过后,CA机构颁发证书并通过邮件或邮寄方式发送。收到证书后按指南安装并使用签名工具对程序进行数字签名,确保软件完整性和可信度。注意证书有效期、管理和兼容性问题。
|
7月前
|
自然语言处理 安全 测试技术
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
366 0
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
|
9月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
696 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
11月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
289 5
|
11月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
282 4
|
11月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
235 2

热门文章

最新文章