亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

c++怎么將程序注冊(cè)為系統(tǒng)服務(wù)_c++程序注冊(cè)系統(tǒng)服務(wù)方法

尼克
發(fā)布: 2025-10-15 19:45:01
原創(chuàng)
900人瀏覽過
在Windows中,C++程序可通過API注冊(cè)為系統(tǒng)服務(wù),實(shí)現(xiàn)后臺(tái)運(yùn)行與開機(jī)自啟。首先編寫ServiceMain和ServiceCtrlHandler函數(shù)處理服務(wù)啟動(dòng)與控制命令,接著使用CreateService安裝服務(wù)、DeleteService卸載服務(wù),并在main函數(shù)中通過命令行參數(shù)區(qū)分安裝、卸載與運(yùn)行模式,最終通過StartServiceCtrlDispatcher接入服務(wù)控制管理器。需管理員權(quán)限操作,且建議先以普通進(jìn)程調(diào)試邏輯。

c++怎么將程序注冊(cè)為系統(tǒng)服務(wù)_c++程序注冊(cè)系統(tǒng)服務(wù)方法

在Windows系統(tǒng)中,C++程序可以通過調(diào)用Windows服務(wù)控制管理器(SCM)的API將自身注冊(cè)為系統(tǒng)服務(wù)。這種方式可以讓程序在后臺(tái)運(yùn)行,隨系統(tǒng)啟動(dòng)自動(dòng)加載,無需用戶登錄。以下是實(shí)現(xiàn)步驟和關(guān)鍵代碼示例。

1. 編寫服務(wù)主函數(shù)和控制處理函數(shù)

每個(gè)Windows服務(wù)都需要一個(gè)服務(wù)入口函數(shù)(Service Main),以及一個(gè)處理控制請(qǐng)求的回調(diào)函數(shù)(如停止、暫停等)。

  • ServiceMain:服務(wù)啟動(dòng)時(shí)被調(diào)用,負(fù)責(zé)初始化并報(bào)告服務(wù)狀態(tài)。
  • ServiceCtrlHandler:處理來自服務(wù)控制管理器的控制命令,例如 SERVICE_CONTROL_STOP。

示例代碼:

火山方舟
火山方舟

火山引擎一站式大模型服務(wù)平臺(tái),已接入滿血版DeepSeek

火山方舟99
查看詳情 火山方舟
#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>// 服務(wù)入口
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);

// 實(shí)際的服務(wù)工作邏輯
RunService();

// 等待停止信號(hào)
WaitForSingleObject(g_hStopEvent, INFINITE);

g_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(g_StatusHandle, &g_ServiceStatus);
登錄后復(fù)制

}

立即學(xué)習(xí)C++免費(fèi)學(xué)習(xí)筆記(深入)”;

// 控制處理函數(shù) 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. 注冊(cè)服務(wù)到系統(tǒng)(InstallService)

使用CreateService函數(shù)將程序安裝為系統(tǒng)服務(wù)。需要管理員權(quán)限。

示例代碼:

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,  // 隨系統(tǒng)啟動(dòng)
    SERVICE_ERROR_NORMAL,
    szPath,
    NULL, NULL, NULL, NULL, NULL);

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

CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return TRUE;
登錄后復(fù)制

}

3. 卸載服務(wù)(RemoveService)

通過刪除服務(wù)對(duì)象來卸載服務(wù)。

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;
登錄后復(fù)制

}

4. 主函數(shù)中區(qū)分安裝與運(yùn)行

通常通過命令行參數(shù)決定是安裝服務(wù)還是運(yùn)行服務(wù)。

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;
登錄后復(fù)制

}

編譯后可執(zhí)行以下操作:

  • myapp.exe install —— 安裝服務(wù)
  • myapp.exe remove —— 卸載服務(wù)
  • 直接運(yùn)行或系統(tǒng)自動(dòng)啟動(dòng) —— 進(jìn)入服務(wù)模式

基本上就這些。確保以管理員權(quán)限運(yùn)行安裝命令,并注意服務(wù)名稱唯一性。調(diào)試服務(wù)時(shí)建議先以普通進(jìn)程測(cè)試邏輯,再注冊(cè)為服務(wù)。

以上就是c++++怎么將程序注冊(cè)為系統(tǒng)服務(wù)_c++程序注冊(cè)系統(tǒng)服務(wù)方法的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

c++速學(xué)教程(入門到精通)
c++速學(xué)教程(入門到精通)

c++怎么學(xué)習(xí)?c++怎么入門?c++在哪學(xué)?c++怎么學(xué)才快?不用擔(dān)心,這里為大家提供了c++速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)