用C语言编写Windows服务程序


//需要调用Win32函数

#include<windows.h>

#define SLEEP_TIME 5000 //服务循环延时

 

SERVICE_STATUS ServiceTest; //服务状态
SERVICE_STATUS_HANDLE ServiceStatus; //处理服务状态

//定义服务入口函数
//貌似可以定义多个服务 未测
void ServiceMain(int argc, char** argv);

//定义控制处理函数
void ControlHandler(DWORD request);


//程序入口函数
//Windows服务程序的main函数很短,只需要创建分派表并启动控制分派机
int main()
{
//定义服务分派表
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = (LPWSTR)"ServicTest"; //服务名称
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; //服务入口指针

//定义一条空的服务分派表
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;

//启动控制分派机
StartServiceCtrlDispatcher(ServiceTable);
return 0;
}


//服务入口点
void ServiceMain(int argc, char** argv)
{
ServiceTest.dwServiceType = SERVICE_WIN32; //指定服务类型 这个是表示创建 Win32 服务
ServiceTest.dwCurrentState = SERVICE_START_PENDING; //指定服务当前状态
ServiceTest.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; //域通知 SCM 服务接受哪个域
ServiceTest.dwWin32ExitCode = 0; //终止服务并报告退出细节时有用 貌似正常终止为0 异常终止为-1
ServiceTest.dwServiceSpecificExitCode = 0; //终止服务并报告退出细节时有用 初始化不退出 所以为0
ServiceTest.dwCheckPoint = 0; //这个域表示初始化某个服务进程时要30秒以上
ServiceTest.dwWaitHint = 0;//这个域表示初始化某个服务进程时要30秒以上 因为此初始化过程很短,所以也为0

//为服务注册控制处理器
ServiceStatus = RegisterServiceCtrlHandler((LPCWSTR)"MemoryStatus", (LPHANDLER_FUNCTION)ControlHandler);

if (ServiceStatus == (SERVICE_STATUS_HANDLE)0)
{
//控制处理器注册失败
return;
}


//向 SCM 报告运行状态
ServiceTest.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(ServiceStatus, &ServiceTest);//用 hStatus 向 SCM 报告服务的状态

//可以开始大显神通了
while (ServiceTest.dwCurrentState == SERVICE_RUNNING)
{
//本循环唯一作用 是保证服务不直接结束掉
Sleep(SLEEP_TIME);
}

 

ServiceTest.dwWin32ExitCode = 0;
ServiceTest.dwCurrentState = SERVICE_STOPPED;//服务已停止

SetServiceStatus(ServiceStatus, &ServiceStatus);

return;
}


//控制处理器函数
void ControlHandler(DWORD request)
{
switch (request)
{
case SERVICE_CONTROL_STOP:
//这里是SCM终止服务的时候发出的
//例如用户手动停止服务
ServiceTest.dwWin32ExitCode = 0;
ServiceTest.dwCurrentState = SERVICE_STOPPED;//服务已停止

SetServiceStatus(ServiceStatus, &ServiceStatus);
return;
case SERVICE_CONTROL_SHUTDOWN:
//这里是关闭机器的时候 SCM发送给所有运行中服务的
ServiceTest.dwWin32ExitCode = 0;
ServiceTest.dwCurrentState = SERVICE_STOPPED;//服务已停止

SetServiceStatus(ServiceStatus, &ServiceStatus);
return;
default:
break;
}

//报告当前状态
SetServiceStatus(ServiceStatus, &ServiceStatus);

return;

}

/*

服务类型说明:

SERVICE_FILE_SYSTEM_DRIVER=2

文件系统驱动服务。

SERVICE_KERNEL_DRIVER=1

驱动服务。

SERVICE_WIN32_OWN_PROCESS=16

独占一个进程的服务。

SERVICE_WIN32_SHARE_PROCESS=32

与其他服务共享一个进程的服务。

*/

我用的开发环境是VS2019
VS2019没有找到C++的Windows服务的开发模板 直接新建空项目即可

安装服务:
cmd安装
安装指令:sc create 服务名称 binpath = 服务exe路径
卸载指令:sc delete 服务名称

创建服务后,可打开服务管理器(运行services.msc)进行操作

萌新第一篇博客
posted @ 2020-11-13 17:24  小包子Dre  阅读(732)  评论(0)    收藏  举报