首页 > 后端开发 > C++ > 正文

c++怎么将程序注册为系统服务_c++程序注册系统服务方法

尼克
发布: 2025-10-15 19:45:01
原创
927人浏览过
在Windows中,C++程序可通过API注册为系统服务,实现后台运行与开机自启。首先编写ServiceMain和ServiceCtrlHandler函数处理服务启动与控制命令,接着使用CreateService安装服务、DeleteService卸载服务,并在main函数中通过命令行参数区分安装、卸载与运行模式,最终通过StartServiceCtrlDispatcher接入服务控制管理器。需管理员权限操作,且建议先以普通进程调试逻辑。

c++怎么将程序注册为系统服务_c++程序注册系统服务方法

在Windows系统中,C++程序可以通过调用Windows服务控制管理器(SCM)的API将自身注册为系统服务。这种方式可以让程序在后台运行,随系统启动自动加载,无需用户登录。以下是实现步骤和关键代码示例。

1. 编写服务主函数和控制处理函数

每个Windows服务都需要一个服务入口函数(Service Main),以及一个处理控制请求的回调函数(如停止、暂停等)。

  • ServiceMain:服务启动时被调用,负责初始化并报告服务状态。
  • ServiceCtrlHandler:处理来自服务控制管理器的控制命令,例如 SERVICE_CONTROL_STOP。

示例代码:

#include <windows.h>
<p>SERVICE_STATUS g_ServiceStatus = {0};
SERVICE_STATUS_HANDLE g_StatusHandle = NULL;
HANDLE g_hStopEvent = INVALID_HANDLE_VALUE;</p><p>VOID WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
VOID WINAPI ServiceCtrlHandler(DWORD control);
DWORD RunService();</p><p>// 服务入口
VOID WINAPI ServiceMain(DWORD argc, LPTSTR *argv) {
g_StatusHandle = RegisterServiceCtrlHandler(TEXT("MyService"), ServiceCtrlHandler);
if (g_StatusHandle == NULL) return;</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">g_ServiceStatus.dwServiceType = SERVICE_WIN32;
g_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
g_ServiceStatus.dwWin32ExitCode = 0;
g_ServiceStatus.dwServiceSpecificExitCode = 0;
g_ServiceStatus.dwCheckPoint = 0;
g_ServiceStatus.dwWaitHint = 0;

SetServiceStatus(g_StatusHandle, &g_ServiceStatus);

g_hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (g_hStopEvent == NULL) {
    g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
    g_ServiceStatus.dwWin32ExitCode = GetLastError();
    SetServiceStatus(g_StatusHandle, &g_ServiceStatus);
    return;
}

g_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(g_StatusHandle, &g_ServiceStatus);

// 实际的服务工作逻辑
RunService();

// 等待停止信号
WaitForSingleObject(g_hStopEvent, INFINITE);

g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(g_StatusHandle, &g_ServiceStatus);
登录后复制

}

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

// 控制处理函数 VOID WINAPI ServiceCtrlHandler(DWORD control) { switch(control) { case SERVICE_CONTROL_STOP: g_ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); SetEvent(g_hStopEvent); break; default: break; } }

2. 注册服务到系统(InstallService)

使用CreateService函数将程序安装为系统服务。需要管理员权限。

启科网络PHP商城系统
启科网络PHP商城系统

启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。

启科网络PHP商城系统 0
查看详情 启科网络PHP商城系统

示例代码:

BOOL InstallService(LPCTSTR szPath) {
    SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL) return FALSE;
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">SC_HANDLE schService = CreateService(
    schSCManager,
    TEXT("MyService"),
    TEXT("My Sample Service"),
    SERVICE_ALL_ACCESS,
    SERVICE_WIN32_OWN_PROCESS,
    SERVICE_AUTO_START,  // 随系统启动
    SERVICE_ERROR_NORMAL,
    szPath,
    NULL, NULL, NULL, NULL, NULL);

if (schService == NULL) {
    CloseServiceHandle(schSCManager);
    return FALSE;
}

CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return TRUE;
登录后复制

}

3. 卸载服务(RemoveService)

通过删除服务对象来卸载服务。

BOOL RemoveService() {
    SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL) return FALSE;
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">SC_HANDLE schService = OpenService(schSCManager, TEXT("MyService"), SERVICE_ALL_ACCESS);
if (schService == NULL) {
    CloseServiceHandle(schSCManager);
    return FALSE;
}

BOOL result = DeleteService(schService);
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return result;
登录后复制

}

4. 主函数中区分安装与运行

通常通过命令行参数决定是安装服务还是运行服务。

int main(int argc, char* argv[]) {
    if (argc > 1 && strcmp(argv[1], "install") == 0) {
        TCHAR szPath[MAX_PATH];
        GetModuleFileName(NULL, szPath, MAX_PATH);
        if (InstallService(szPath)) {
            printf("Service installed successfully.\n");
        } else {
            printf("Failed to install service.\n");
        }
        return 0;
    }
    else if (argc > 1 && strcmp(argv[1], "remove") == 0) {
        if (RemoveService()) {
            printf("Service removed.\n");
        } else {
            printf("Failed to remove service.\n");
        }
        return 0;
    }
    else {
        SERVICE_TABLE_ENTRY ServiceTable[] = {
            {TEXT("MyService"), (LPSERVICE_MAIN_FUNCTION)ServiceMain},
            {NULL, NULL}
        };
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">    if (StartServiceCtrlDispatcher(ServiceTable) == FALSE) {
        return GetLastError();
    }
}
return 0;
登录后复制

}

编译后可执行以下操作:

  • myapp.exe install —— 安装服务
  • myapp.exe remove —— 卸载服务
  • 直接运行或系统自动启动 —— 进入服务模式

基本上就这些。确保以管理员权限运行安装命令,并注意服务名称唯一性。调试服务时建议先以普通进程测试逻辑,再注册为服务。

以上就是c++++怎么将程序注册为系统服务_c++程序注册系统服务方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号