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-11-18 22:34:46

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

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

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

深入详解C编写Windows服务程序的五个步骤_C 语言

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

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

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

用Visual C#创建Windows服务程序

visual|window|程序|创建  一.Windows服务介绍: Windows服务以前被称作NT服务,是一些运行在Windows NT.Windows 2000和Windows XP等操作系统下用户环境以外的程序.在以前,编写Windows服务程序需要程序员很强的C或C++功底.然而现在在Visual Studio.Net下,你可以运用C++或Visual C#或Visual Basic.Net很轻松的创建一个Windows服务程序.同样,你还可以运用其他任何与CLR相容的语言来创建Wi

用ATL编写Windows服务

有时候,我们需要自己写的程序在没有用户登陆的情况下,只要Windows系统启动就运行,那我们可以把我们的程序写成一个Windows服务. 服务是能够为各种用户(包括本地用户和远程用户)所用的,拥有用户授权级进行管理的能力,并且不论用户是否物理的与正在运行该应用程序的计算机相连都能正常执行. 下面,我将用一个简单的例子说明如何用ATL来编写Windows服务程序. 首先,我们新建一个Project.如图一所示,选择 "ATL COM AppWizard",工程名为:ServiceDemo

VC编写有图形界面的Windows服务程序

环境:Windows 2003,VC 6.0 摘要:从建立一个COM服务程序入手,然后将一个MFC项目改造成服务程序,最后让这一程序在启动时可以显示图形界面. 关键字:windows服务程序 COM服务程序 开机前启动 NT服务 与桌面交互 一.什么是windows的服务程序? 可以使用下面的几种方法看到它. 打开控制面板,然后是管理工具,里面有一个"服务",双击后打开: 或者是通过输入命令的方式,打开开始菜单,点击运行,输入mmc services.msc(mmc可省略),也可打开:

c#编写的windows服务程序调用不了c#写的类库

问题描述 我自己用c#写了个windows服务程序,但是在这里我去调用我自己的c#类库,就会报出找不到类库的程序集或者依赖项,但是我把这个类库让其他控制台或者winform都可以调用这个类库,这是为什么呢? 解决方案 解决方案二:类型查看器中,看看能否看到.解决方案三:理论上讲,这么调用没有任何问题导致异常的因素太多了...建议检查代码中1.dll路径相关代码2.dll配置文件相关代码3.依赖项的部署位置...解决方案四:1.你确定你引用了吗?看看DLL有没有跟服务在相同的目录里2.确定一下,你

Mysql C API编程:用C语言编写的Mysql编程接口

软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程. API,全称Application Programming Interfaces,即应用程序编程接口,我们可以调用这些接口,执行API函数提供的功能. Mysql C语言API就是用C语言编写的Mysql编程接口,使用这些接口函数可以实现对Mysql数据库的查询等操作. Mysql的安装 要进行Mysql编程首先要在充当Mysql服务器的电脑和

SOAP净化有线协议(三):用脚本语言编写服务

脚本 你是一个渴望永远站在技术最前沿的Java开发者吗?软件产业风云变幻,你渴望把握Web的未来,更重要的是,如何把自己数年的Java经验发挥到极致.要寻找这些问题的答案,你不必走得太远,答案就在于SOAP. SOAP(简单对象访问协议)是一种利用XML编码数据的有线协议,它为Java的平台无关性.可移植性带来了更高层次的协同操作能力.在这个关于SOAP的系列文章的第二篇中,我介绍了Apache SOAP.作为SOAP规范的实现之一,Apache SOAP简化了SOAP应用的构造.我们曾经用Ap