Qt 与 Windows 服务

淘宝店遇到客户如下咨询:

image-20251201233327490

具体情况如下:

客户用 Qt 的 Core Network 写了个控制台程序,通过 QTcpServer 监听客户端连接,实现一些功能

直接作为 exe 双击运行,没啥问题,但客户现在想注册为 Windows 服务,却发现能启动,但是客户端连不上。

其实直接原因是客户把控制台程序 强行注册成服务

一、先说“强行注册成服务”一般长什么样

很多人一开始是这么干的:

  1. 写了一个正常的 Qt 控制台程序:

  2. 然后用 sc create 或者服务安装工具,直接把这个 exe 注册成服务:

表面上看:

但问题是: 你的程序从头到尾,都只是一个“普通 EXE”,根本没有按照服务的规范跟系统打招呼,所以:

这就是我说的:

你只是把控制台程序强行注册成服务


二、那“一个真正的 Windows 服务”需要做什么?

一个合格的 Windows 服务程序,至少要做这些步骤(简化版):

  1. 程序入口(main / WinMain)里调用:

    告诉系统: 我支持服务模式,你可以把客户端请求(启动/停止等)派发给我。

  2. 提供一个 ServiceMain 函数(就是那个接口/回调):

    当你在“服务”里点启动时,SCM 会在某个线程里调用这个 ServiceMain。

  3. ServiceMain 里你要做:

    • RegisterServiceCtrlHandler 注册一个控制回调,用于接收“停止、暂停”等命令;

    • SetServiceStatus 报告当前服务状态:

      • 刚开始:SERVICE_START_PENDING(正在启动)

      • 准备好了:SERVICE_RUNNING(已经运行)

    • 在适当的时候(通常是自己的事件循环退出后)再报告 SERVICE_STOPPED

  4. Service 控制回调里要能处理停止命令:

只有做完这些事情,SCM 才认为你是一个“正经服务”,并且能正常管理你。

三、通过 NSSM 软件可以简化上述流程

nssm 全称 Non-Sucking Service Manager

是Windows环境下一款免安装的服务管理软件,它可以将应用封装成服务

即将普通 exe程序 或者 jar包 应用封装成服务使之像windows服务可以设置自动启动等。

并且可以监控程序运行状态,程序异常中断后自动启动,实现守护进程的功能。

官网地址 nssm.cc

git地址 https://git.nssm.cc/nssm/nssm

NSSM常用命令,如下:

  1. 安装服务:nssm install 服务名称

  2. 删除服务:nssm remove 服务名称

  3. 删除服务确定:nssm remove 服务名称 confirm

  4. 修改服务:nssm edit 服务名称

  5. 启动服务:nssm start 服务名称

  6. 停止服务:nssm stop 服务名称

最后客户使用了 NSSM 解决了他的问题