什么是服务
windows服务应用程序是一种长期运行在操作系统后台的程序
它没有用户界面,不会产生任何可视输出
计算机启动时,服务会自动开始运行,有极高的权限
例子
用boost beast 库做一个异步服务器
Boost.Beast参考文档
Boost库下载已经编译好了的
Cpoy的代码块
使用方法
这样本地就能访问网页了
用boost库代码变成 Windows 服务程序
服务程序的与普通应用程序一样也需要一个主函数(main())作为程序的入口,与之不同的是作为一个服务程序它需要在主函数(main())中立即调用StartServiceCtrlDispatcher来注册一个服务的入口函数
API StartServiceCtrlDispatcher
StartServiceCtrlDispatcher 这个API需要一个参数为SERVICE_TABLE_ENTRY结构体的指针
SERVICE_TABLE_ENTRY参数第一个是存储服务的内部名称,第二个是服务入口函数的指针。
2.所以接下来写服务入口函数,把地址参数放入SERVICE_TABLE_ENTRY这个API中
服务入口函数的API为
VOID WINAPI ServiceMain( DWORD dwArgc, // number of arguments LPTSTR *lpszArgv // array of arguments );
在这个API中我们要注册必须调用RegisterServiceCtrlHandler完成Handler函数的注册,这个函数用来接收和处理SCM的控制消息。
API ** RegisterServiceCtrlHandler **
SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler( LPCTSTR lpServiceName, // service name(服务内部名称) LPHANDLER_FUNCTION lpHandlerProc // handler function(处理的回调函数地址) );
回调函数API
VOID WINAPI Handler( DWORD fdwControl // requested control code );
最后总结下:
(1)在main()调用StartServiceCtrlDispatcher来注册一个服务的入口函数;
(2)在ServerMain(DWORD argc,LPTSTR *argv)中调RegisterServiceCtrlHandler注册Handler函数。
(3)完成业务处理程序的初始化工作,如果初始化时间较长要实时向SCM报告当前正在启动
(4)初始化完毕,报告服务正在运行;开始业务处理工作。
服务控制程序
OpenSCManager 打开服务控制管理器
CreateService 创建服务
OpenService 打开服务
EnumServicesStatus 枚举服务
ChangeServiceConfig 修改服务信息
QueryServiceConfig 查询服务信息
StartService 开启服务
QueryServiceStatus 查询服务状态
ControlService 通过SCM发送相关服务控制请求
暂停、恢复运行等
DeleteService 删除服务
创建的代码
m_SCManager = OpenSCManager( NULL, // computer name NULL, // SCM database name SC_MANAGER_ALL_ACCESS // access type ); if (m_SCManager == NULL) return; LPCSTR str ="E:\\\\CC++project\\c++\\科锐二阶段复习\\2019-10-30\\Server\\Debug\\Server.exe"; LPCSTR lpDisplayName = "MyServer by Boost"; m_Service= CreateServiceA( m_SCManager, "CR31_Http_Srv", lpDisplayName, // display name SERVICE_ALL_ACCESS, // type of access to service SERVICE_WIN32_OWN_PROCESS, // type of service SERVICE_AUTO_START, // when to start service SERVICE_ERROR_NORMAL, // severity of service failure str, // name of binary file NULL,NULL,NULL,NULL ,NULL // account password ); if(m_Service!=NULL) { qDebug() << "Sucess"; }
草堂教程网 » WindowsAPI之ServiceMain系统服务编程技术