首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

ATL 開發 Windows 服務完整指南:從專案建立到定時任務實作

     編輯:關於VC++

Windows 服務能在無使用者登入、系統啟動時即自動執行,適合後台監控、資料同步等長期任務。本文以 ATL COM AppWizard 為基礎,示範建立服務專案、註冊/安裝技巧,並加入「每 2 秒遞增計數並寫入應用程式事件日誌」的範例功能。

1. 專案建立與預設程式碼解析

  • AppWizard 選 ATL COM AppWizard → 專案類型選 Service (EXE)。
  • 精靈產生 CServiceModule 類別,全域變數 _Module 為其實例。
  • 關鍵函式:
    _tWinMain:進入點,支援命令列參數 /RegServer(元件註冊)、/Service(服務註冊)、/UnRegServer(移除)。
    Run():服務主迴圈,業務邏輯由此擴充。
    Install():呼叫 CreateService 向 SCM 註冊,第 6 參數 SERVICE_DEMAND_START(手動)可改 SERVICE_AUTO_START(自動),第 11 參數可指定相依服務(如 _T("MSSQLSERVER\0"))。

2. 免命令列自動註冊技巧

專案屬性 → Custom Build 步驟加入:"$(TargetPath)" /Service。每次編譯後自動完成服務註冊,省去手動切換命令列。

3. 加入業務邏輯:定時器 + 事件日誌

  1. 在 CServiceModule 加入 int n;,Init() 中歸零。
  2. 新增成員函式 Adder():遞增 n 並呼叫 LogEvent 寫入系統日誌。
  3. 編譯錯誤 CString 未定義:專案屬性雖設「Use MFC in Static Library」但未含標頭。在 StdAfx.h 的 #include <atlbase.h> 前加入 #include <afx.h> 即可。
  4. 在 Run() 訊息迴圈前插入:
    SetTimer(NULL, 1, 2000, (TIMERPROC)OnTimerProc);
    全域回呼函式:
    VOID CALLBACK OnTimerProc(HWND, UINT, UINT_PTR, DWORD) { _Module.Adder(); }

4. 驗證與除錯

  • 編譯後開啟「服務」管理員,啟動 ServiceDemo。
  • 開啟「事件檢視器」→「應用程式日誌」,可見每 2 秒記錄一次遞增數值。
  • 除錯設定:專案屬性 → Debug → 命令列填入服務可執行檔路徑,即可中斷點追蹤。

關鍵 API 快查表

API用途
CreateService向 SCM 註冊服務
SetTimer建立週期性定時器
LogEvent寫入 Windows 事件日誌
AdjustTokenPrivileges提升權限(OpenProcess 失敗時)

掌握 ATL 服務架構後,即可將任意後台邏輯封裝為高可靠度的系統服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved