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

C 編寫 Windows 服務程序五步法:從骨架到內存監控實戰

     編輯:C 語言基礎

服務程序特點

後台運行、無用戶交互、可設置開機自啟。C 語言無類封裝,適合理解 SCM(服務控制管理器)底層交互流程。

五步構建核心骨架

  1. 主函數與分派表:
    void main() {
        SERVICE_TABLE_ENTRY table[2] = {
            {"MemoryStatus", (LPSERVICE_MAIN_FUNCTION)ServiceMain},
            {NULL, NULL}
        };
        StartServiceCtrlDispatcher(table);  // 主線程轉為控制分派器
    }
  2. ServiceMain 入口:註冊控制處理器、報告狀態、啟動工作線程、初始化。
    void ServiceMain(int argc, char **argv) {
        hStatus = RegisterServiceCtrlHandler("MemoryStatus", ControlHandler);
        ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
        SetServiceStatus(hStatus, &ServiceStatus);
        if (InitService()) {
            ServiceStatus.dwCurrentState = SERVICE_RUNNING;
            SetServiceStatus(hStatus, &ServiceStatus);
            // 啟動工作循環線程或直接循環
        }
    }
  3. 控制處理器 ControlHandler:響應 SCM 命令(停止、暫停、繼續、關機等)。
    void ControlHandler(DWORD request) {
        switch (request) {
            case SERVICE_CONTROL_STOP:
                ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
                SetServiceStatus(hStatus, &ServiceStatus);
                // 通知工作線程退出
                break;
            // ... 其他命令
        }
    }
  4. 初始化 InitService:創建日志目錄、啟動工作線程。
    int InitService() {
        CreateDirectory("C:\\MyServices", NULL);
        HANDLE hThread = CreateThread(NULL, 0, WorkerThread, NULL, 0, NULL);
        return (hThread != NULL);
    }
  5. 工作線程 WorkerThread:核心業務邏輯(如每 5 秒查詢可用物理內存寫日志)。
    DWORD WINAPI WorkerThread(LPVOID param) {
        while (ServiceStatus.dwCurrentState == SERVICE_RUNNING) {
            MEMORYSTATUS ms; ms.dwLength = sizeof(ms);
            GlobalMemoryStatus(&ms);
            char buf[128];
            sprintf(buf, "Available Physical Memory: %lu KB", ms.dwAvailPhys / 1024);
            WriteToLog(buf);
            Sleep(5000);
        }
        return 0;
    }

構建安裝運行

  • 編譯生成 memsvc.exe
  • 安裝:sc create MemoryStatus binPath= "C:\path\memsvc.exe"
  • 啟動:sc start MemoryStatus 或服務管理器中啟動
  • 查看日志:C:\MyServices\memstatus.txt
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved