void WINAPI ServiceMain(int argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandle(DWORD Opcode);
BOOL bRunning = TRUE; //标记当前自己的服务程序是否在运行,全局变量
int _tmain(int argc, _TCHAR* argv[])
{
SERVICE_TABLE_ENTRY DispatchTable[2]; //一个服务 数组的名称就是数组的地址
DispatchTable[0].lpServiceName = _T("my_service");
DispatchTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
DispatchTable[1].lpServiceName = NULL;
DispatchTable[1].lpServiceProc = NULL;
//开始构建自己的服务程序,通知系统的服务控制管理器,现在开发的应用程序是一个服务程序
StartServiceCtrlDispatcher(DispatchTable); //服务控制分派器 用来连接到服务控制管理器 把自己的应用程序注册成服务
return 0;
}
SERVICE_STATUS ServiceStatus; //服务状态
SERVICE_STATUS_HANDLE ServiceStatusHandle; //服务控制
void WINAPI ServiceMain(int argc, LPTSTR *argv)
{
//服务状态
ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING; //等待 当前的服务还没有启动
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
//注册服务控制函数
ServiceStatusHandle = RegisterServiceCtrlHandler(_T("my_service"), ServiceCtrlHandle);
if (ServiceStatusHandle == 0) //注册服务没有成功
{
WriteToLog("RegisterServiceCtrlHandler failed");
}
WriteToLog("RegisterServiceCtrlHandler success");
//设置服务的状态,已经成功运行
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
//启动服务成功,可以去干一些自己想干的任意事情
bRunning = TRUE;
while (bRunning)
{
sprintf_s("Hello World\n");
}
return;
}
//负责接收并处理服务管理器的通知 服务控制器
void WINAPI ServiceCtrlHandle(DWORD Opcode)
{
switch (Opcode)
{
case SERVICE_CONTROL_STOP:
bRunning = FALSE;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
case SERVICE_CONTROL_SHUTDOWN:
bRunning = FALSE;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}
SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
}
最简单的系统服务编程框架
最新推荐文章于 2024-07-23 15:33:57 发布