用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)进行操作
萌新第一篇博客

浙公网安备 33010602011771号