讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何将程序注册为Windows系统服务

云杰大大_2063

云杰大大_2063

发布时间:2026-11-05 13:49:28

|

732人浏览过

|

来源于php中文网

原创

Windows服务必须实现SERVICE_MAIN_FUNCTION入口并注册到SCM,否则启动报错1053;需用sc create安装、事件日志调试、协作式停止,严禁在ServiceMain中阻塞或直接exit。

c++如何将程序注册为windows系统服务

Windows服务程序必须继承 SERVICE_MAIN_FUNCTION

直接用普通 main() 启动的 C++ 程序无法被 Windows 服务控制管理器(SCM)识别。必须实现一个符合 Windows 服务契约的入口函数,类型为 SERVICE_MAIN_FUNCTION,并在 StartServiceCtrlDispatcher() 中注册它。

常见错误是把服务逻辑写在 main() 里,然后用 sc create 强行注册——这会导致 SCM 启动后立即报错 1053(服务未及时响应启动或控制请求)。

  • SERVICE_MAIN_FUNCTION 函数名任意,但签名必须是 VOID WINAPI ServiceMain(DWORD argc, LPWSTR *argv)
  • 该函数内第一件事是调用 RegisterServiceCtrlHandlerEx() 设置控制处理器,否则无法接收暂停/停止等指令
  • 不要在 ServiceMain 中执行耗时初始化;应另起线程处理业务,主线程保持对 SCM 的响应能力

服务安装必须用 sc.exe 或 CreateService(),不能双击运行

Windows 服务不是常规 GUI 或控制台程序,没有交互式桌面会话权限(默认情况下),也不能通过双击 exe 启动。安装必须由管理员权限发起,且需明确指定启动类型、账户上下文和二进制路径。

最简安装命令示例:
sc create MyService binPath= "C:\path\to\service.exe" start= auto obj= ".\LocalSystem"

Windows 图片打印
Windows 图片打印

通过 Python 使用 mspaint /pt 在 Windows 上打印图像——绕过 bash 中文路径编码问题。

下载
  • binPath= 值前后不能有空格,路径含空格时需用英文引号包裹整个路径(如 binPath= "\"C:\My App\svc.exe\"")
  • obj= 指定运行账户:LocalSystem 权限高但不推荐;NT AUTHORITY\NetworkService 更安全;自定义账户需提前授予“作为服务登录”权限(secpol.msc → 本地策略 → 用户权限分配)
  • 若服务需要访问网络资源或用户配置文件,obj= 不能设为 LocalSystem(它没有用户 profile)

服务调试不能靠 printf + 控制台,要用事件日志或远程调试

服务进程默认无控制台,printf、std::cout、OutputDebugString(除非 Attach 到调试器)都看不到输出。直接加断点调试也常失败,因为 SCM 启动服务时可能不带调试环境。

立即学习“C++免费学习笔记(深入)”;

  • 首选方式:用 ReportEvent() 写入 Windows 事件日志(Application 或自定义日志),配合 eventvwr.msc 查看
  • 临时调试:在 ServiceMain 开头加 AllocConsole(); freopen("CONOUT$", "w", stdout);,仅限开发机测试(正式部署必须移除)
  • 远程调试:用 Visual Studio 远程调试器(msvsmon.exe),以服务账户身份运行调试器,并在服务代码中插入 DebugBreak()
  • 注意:启用 AllowServiceLogon 权限后,某些账户才允许写入事件日志

服务停止时必须正确释放资源并响应 SERVICE_CONTROL_STOP

用户点击“停止服务”或执行 sc stop MyService 时,SCM 发送 SERVICE_CONTROL_STOP,你的控制处理器必须在 30 秒内返回(超时即被强制终止)。此时不能简单杀线程或 exit,而要协作式退出。

  • 在控制处理器中设置全局标志(如 volatile BOOL g_ServiceStopRequested = FALSE),业务线程轮询该标志
  • 避免使用 TerminateThread() —— 它跳过栈展开,极易导致资源泄漏或死锁
  • 等待子线程自然退出(用 WaitForSingleObject() + 超时),再调用 SetServiceStatus() 报告 SERVICE_STOP_PENDING 和最终 SERVICE_STOPPED
  • 如果服务打开了命名管道、共享内存或全局对象,注意它们的生命周期是否跨服务重启;重复创建可能报错 ERROR_ALREADY_EXISTS
服务最难的部分不在注册,而在状态同步与资源生命周期管理——SCM 不关心你做什么,只关心你是否按时回应、是否干净退出。很多崩溃或卡死,根源是控制处理器没及时返回,或者主线程在等某个永远不结束的 I/O。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2288

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1039

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

447

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

347

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

426

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

600

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1429

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1237

2024.03.22

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.2万人学习

Python 并发编程实战
Python 并发编程实战

共12课时 | 1.1万人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn