一个用C写的windows服务框架

 
// ServiceArchitecture.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>

HANDLE hCtrlEvent;

SERVICE_STATUS ServiceStatus; 
SERVICE_STATUS_HANDLE hStatus; 

BOOL bServicePause=FALSE;

void ServiceMain(int argc, _TCHAR** argv); 
void WINAPI ControlHandler(DWORD request); 
int InitService();
void Run();

#define SERVICE_NAME L"MemoryStatus"

int _tmain(int argc, _TCHAR* argv[])
{
	SERVICE_TABLE_ENTRY ServiceTable[2];
	ServiceTable[0].lpServiceName = SERVICE_NAME;
	ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

	ServiceTable[1].lpServiceName = NULL;
	ServiceTable[1].lpServiceProc = NULL;

	// 启动服务的控制分派机线程,服务退出后此函数才返回
	StartServiceCtrlDispatcher(ServiceTable); 
	::OutputDebugString(L"Main thread exit.");
	return 0;
}

void ServiceMain(int argc, _TCHAR** argv)
{
	ServiceStatus.dwServiceType				= SERVICE_WIN32; 
	ServiceStatus.dwCurrentState			= SERVICE_START_PENDING; 
	ServiceStatus.dwControlsAccepted		= SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
	ServiceStatus.dwWin32ExitCode			= 0; 
	ServiceStatus.dwServiceSpecificExitCode	= 0; 
	ServiceStatus.dwCheckPoint				= 0; 
	ServiceStatus.dwWaitHint				= 0; 

	hStatus = ::RegisterServiceCtrlHandler(SERVICE_NAME, ControlHandler);
	if (reinterpret_cast<SERVICE_STATUS_HANDLE>(0) == hStatus)
	{
		return;
	}

	//创建控制事件
	hCtrlEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

	ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
	BOOL bResult = ::SetServiceStatus(hStatus, &ServiceStatus);
	if (bResult)
	{
		Run();
	}
}

void WINAPI ControlHandler(DWORD dwRequest)
{
	switch (dwRequest)
	{
	case SERVICE_CONTROL_PAUSE:
		{
			::OutputDebugString(L"Service is set to Pausing...............");
			bServicePause=TRUE;

			ServiceStatus.dwCurrentState = SERVICE_PAUSED;
			::SetServiceStatus(hStatus, &ServiceStatus);
			break;
		}
	case SERVICE_CONTROL_CONTINUE:
		{
			::OutputDebugString(L"Service is set to Continuing...............");
			bServicePause=FALSE;

			ServiceStatus.dwCurrentState = SERVICE_RUNNING;
			::SetServiceStatus(hStatus, &ServiceStatus);
			break;
		}
	case SERVICE_CONTROL_STOP:
		{
			::OutputDebugString(L"Service is set to Stopping...............");
			//关闭控制事件
			CloseHandle(hCtrlEvent);

			ServiceStatus.dwCurrentState = SERVICE_STOPPED;
			::SetServiceStatus(hStatus, &ServiceStatus);
			break;
		}
	case SERVICE_CONTROL_SHUTDOWN:
		{
			::OutputDebugString(L"Service is set to Shutting down...............");
			//关闭控制事件
			CloseHandle(hCtrlEvent);

			ServiceStatus.dwCurrentState = SERVICE_STOPPED;
			::SetServiceStatus(hStatus, &ServiceStatus);
			break;
		}
	default:
		{

		}
	}
}

void Run()
{
	for(;;)
	{
		DWORD hr = WaitForSingleObject(hCtrlEvent,1000*20);
		if (hr == WAIT_TIMEOUT)
		{
			//有信号状态
			//执行任务
			if (bServicePause)
			{
				::OutputDebugString(L"Service is Pausing...............");
			}
			else
			{
				::OutputDebugString(L"Service is Running...............");
			}
		}
		else if(hr == WAIT_ABANDONED)
		{
			//说明事件被销毁,服务应被停止
			//TODO: 一些清理工作
			::OutputDebugString(L"Service is Stopped ...............");
			break;
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值