// 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;
}
}
}
一个用C写的windows服务框架
最新推荐文章于 2022-09-14 14:27:27 发布