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

VC++ 編寫帶圖形介面的 Windows 服務程式 (服務與桌面互動)

     編輯:VC 教學

架構概覽

  1. 建立 ATL COM 服務專案 (產生 `CServiceModule` 封裝安裝/啟動/控制處理)。
  2. 將 MFC 對話框專案融合:複製 `CServiceModule` 程式碼,移除 COM 相關註冊代碼。
  3. 關鍵:`CreateService` 時加入 `SERVICE_INTERACTIVE_PROCESS` 旗標,允許服務與桌面互動 (顯示 UI)。

步驟詳解

1. ATL 服務專案產生樣板

File → New → Projects → ATL COM AppWizard → Service (EXE) → `TestSvc`。編譯得 `TestSvc.exe`。

2. 移植到 MFC 專案

  • 複製 `CServiceModule` 宣告/實作到 MFC 專案 `stdafx.h` / `mfc1.cpp`。
  • 包含 ``,註冊表資源 `IDS_SERVICENAME` = "MFCService"。
  • 刪除 `RegisterServer`/`UnregisterServer`、`CoInitializeSecurity` 等 COM 專用代碼。
  • `Run()` 簡化為標準訊息迴圈:

void CServiceModule::Run() {
    dwThreadID = GetCurrentThreadId();
    LogEvent(_T("Service started"));
    if (m_bService) SetServiceStatus(SERVICE_RUNNING);
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
}

3. MFC 應用程式入口修改


BOOL CMfc1App::InitInstance() {
    _Module.Init(ObjectMap, m_hInstance, IDS_SERVICENAME, NULL);
    _Module.m_bService = TRUE;
    _Module.Start(); // 進入服務訊息迴圈,不再建立對話框
    return FALSE; // 服務模式不返回 TRUE
}

4. 對話框改為服務啟動後顯示


void CServiceModule::Run() {
    // ... 前述代碼 ...
    // 服務啟動後建立並顯示主對話框 (需在訊息迴圈前)
    if (m_bService) {
        CMfc1Dlg dlg; m_pMainWnd = &dlg;
        dlg.DoModal(); // 或 Create + ShowWindow
    }
    // 訊息迴圈 ...
}

5. 安裝/解除安裝按鈕


void CMfc1Dlg::OnBtnInstall() { _Module.Install(); }
void CMfc1Dlg::OnBtnUninstall() { _Module.Uninstall(); }

6. 關鍵:互動式服務旗標


// CServiceModule::Install() 中
SC_HANDLE hSvc = CreateService(hSCM, szName, szName, SERVICE_ALL_ACCESS,
    SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, // ★關鍵
    SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
    szPath, NULL, NULL, _T("RPCSS"), NULL, NULL);
  • 若需**自動啟動**:`SERVICE_DEMAND_START` → `SERVICE_AUTO_START`。
  • Vista/Win7+ Session 0 隔離:互動式服務 UI 僅在同一 Session 可見,建議改用「服務 + 獨立 GUI 進程 + IPC」架構。

驗證

  1. 編譯 `Mfc1.exe`,點擊「安裝服務」。
  2. 開啟 `services.msc`,找到 "MFCService" → 啟動 → 桌面彈出對話框。
  3. 服務列表「停止」 → 對話框關閉。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved