WindowsAPI之ServiceMain系统服务编程技术

什么是服务

  • windows服务应用程序是一种长期运行在操作系统后台的程序

  • 它没有用户界面,不会产生任何可视输出

  • 计算机启动时,服务会自动开始运行,有极高的权限

例子

用boost beast 库做一个异步服务器
Boost.Beast参考文档

Boost库下载已经编译好了的

Cpoy的代码块
使用方法
image.png

ip端口路径线程数
0.0.0.08080.1

这样本地就能访问网页了
image.png

用boost库代码变成 Windows 服务程序

  1. 服务程序的与普通应用程序一样也需要一个主函数(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
);
控制消息宏定义说明
SERVICE_CONTROL_STOP要服务停止
SERVICE_CONTROL_PAUSE要服务暂停
SERVICE_CONTROL_CONTINUE要服务继续
SERVICE_CONTROL_INTERROGATE要服务马上报告它的状态
SERVICE_CONTROL_SHUTDOWN告诉服务即将关机

最后总结下:
(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 删除服务

创建的代码


image.png


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系统服务编程技术

发表评论

欢迎 访客 发表评论

一个纯粹的精品教程收录分享站点

查看演示 官网购买