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

在Windows系统中,C++程序可以通过调用Windows服务控制管理器(SCM)的API将自身注册为系统服务。这种方式可以让程序在后台运行,随系统启动自动加载,无需用户登录。以下是实现步骤和关键代码示例。
每个Windows服务都需要一个服务入口函数(Service Main),以及一个处理控制请求的回调函数(如停止、暂停等)。
示例代码:
#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; } }
使用CreateService函数将程序安装为系统服务。需要管理员权限。
启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
0
示例代码:
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;}
通过删除服务对象来卸载服务。
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;}
通常通过命令行参数决定是安装服务还是运行服务。
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++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号