C语言编写Windows服务程序

原文: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

时间: 2024-10-04 18:04:05

C语言编写Windows服务程序的相关文章

用C语言编写Windows服务程序的五个步骤

Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务.为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择.本文将建立并实现一个简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件.最后,你可以用所学知识编写自己的Windows 服务. 当初他写第一个NT 服务时,他到 MSDN 上找例子.在那里他找到了一篇 Nigel Thompson 写的文章:“Creating a Simple Win32 Service in C++”,

c# 编写Windows服务程序

1.Windows服务程序 在没有涉及到这个问题的时候我也不太明白他里面的深刻奥义.后来知道了这是一个能够长时间运行的应用程序,这个服务只要配置自动启动那么在windows开机启动的时候自动运行起,他没有界面.在Windows机器上能够通过管理工具/服务进行系统运行的所有服务的查看和管理.系统的大部分软件和硬件的运行状态监控都是通过Windows服务进行监控的,通过服务不断轮训去请求BIOS提供的端口收集BIOS收集的硬件的运行状态.可能他们又通过不同的媒介进行展示如windows计数器进行性能

使用C语言编写windows服务一般框架

原文:使用C语言编写windows服务一般框架 编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册,否则会导致服务启动失败.因近期写个服务,其中遇到一些有问题,有部分内容想和大家分享一下,请大家指正. windows服务一般框架代码如下: #include <Windows.h> #include <tchar.h> VOID WINAPI ServiceHandler(DWORD

C#编写Windows服务程序图文教程(转载)

Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Windows Service写很深入. 本文介绍了如何用C#创建.安装.启动.监控.卸载简单的Windows Service 的内容步骤和注意事项. 一.创建一个Windows Service 1)创建Windows Service项目 2)对Service重命名 将Service1重命名为你服务名称,这里我

C#编写Windows服务程序 (服务端),client使用 消息队列 实现淘宝 订单全链路效果

需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group oms(订单管理系统) 实现  , 完毕后 效果:在千牛工作台 --订单全链路  可看到效果例如以下图   -------------------------------------------------------------------------------------------------------

C#编写Windows服务程序 (服务端),客户端使用 消息队列 实现淘宝 订单全链路效果

需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group oms(订单管理系统) 实现  , 完成后 效果:在千牛工作台 --订单全链路  可看到效果如下图   ---------------------------------------------------------------------------------------------------------

用c语言编写windows服务

主要是根据从www.vcbase.com上看到的一篇文章来做这个windows服务的.但是这篇文章一些关键代码并没有贴出来,然而有心人根据作者的描述实现了代码,并且完整的贴了出来,地址是在 http://www.2cto.com/kf/201111/111990.html 我创建的是一个空项目,这个默认的应该是控制台项目.服务的主函数是main而不是winmain,要写一个服务首先要初始化一个SERVICE_TABLE_ENTRY 分派表结构体的列表,然后调用StartServiceCtrlDi

C# 编写Windows Service(windows服务程序)

Windows Service简介: 一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序.Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式.这些启动方式包括了自动启动和手动启动两种.对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了.只要你将相应的Windows服务程序注册到服务控制管理器(Service Control Manager)中,并将其启动

C# 编写Windows Service(windows服务程序)【转载】

[转]http://www.cnblogs.com/bluestorm/p/3510398.html Windows Service简介: 一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序.Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式.这些启动方式包括了自动启动和手动启动两种.对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了.只要你将相应的Wi