共用方式為


CAtlServiceModuleT 類別

這個類別會實作服務。

重要

這個類別及其成員不能用於在 Windows 執行階段 中執行的應用程式。

語法

template <class T, UINT nServiceNameID>
class ATL_NO_VTABLE CAtlServiceModuleT : public CAtlExeModuleT<T>

參數

T
衍生自 CAtlServiceModuleT的類別。

nServiceNameID
服務的資源標識碼。

成員

公用建構函式

名稱 描述
CAtlServiceModuleT::CAtlServiceModuleT 建構函式。

公用方法

名稱 描述
CAtlServiceModuleT::Handler 服務的處理程式例程。
CAtlServiceModuleT::InitializeSecurity 提供服務的預設安全性設定。
CAtlServiceModuleT::Install 安裝並建立服務。
CAtlServiceModuleT::IsInstalled 確認服務已安裝。
CAtlServiceModuleT::LogEvent 寫入事件記錄檔。
CAtlServiceModuleT::OnContinue 覆寫此方法以繼續服務。
CAtlServiceModuleT::OnInterrogate 覆寫此方法以詢問服務。
CAtlServiceModuleT::OnPause 覆寫此方法以暫停服務。
CAtlServiceModuleT::OnShutdown 覆寫此方法以關閉服務
CAtlServiceModuleT::OnStop 覆寫此方法以停止服務
CAtlServiceModuleT::OnUnknownRequest 覆寫此方法以處理服務的未知要求
CAtlServiceModuleT::P arseCommandLine 剖析命令行,並視需要執行註冊。
CAtlServiceModuleT::P reMessageLoop 在輸入訊息迴圈之前,會立即呼叫這個方法。
CAtlServiceModuleT::RegisterAppId 在登錄中註冊服務。
CAtlServiceModuleT::Run 執行服務。
CAtlServiceModuleT::ServiceMain Service Control Manager 呼叫的方法。
CAtlServiceModuleT::SetServiceStatus 更新服務狀態。
CAtlServiceModuleT::Start 服務啟動時由 CAtlServiceModuleT::WinMain 呼叫。
CAtlServiceModuleT::Uninstall 停止並移除服務。
CAtlServiceModuleT::Unlock 遞減服務的鎖定計數。
CAtlServiceModuleT::UnregisterAppId 從登錄中移除服務。
CAtlServiceModuleT::WinMain 這個方法會實作執行服務所需的程序代碼。

公用資料成員

名稱 描述
CAtlServiceModuleT::m_bService 指出程式以服務身分執行的旗標。
CAtlServiceModuleT::m_dwThreadID 儲存線程標識碼的成員變數。
CAtlServiceModuleT::m_hServiceStatus 儲存目前服務之狀態信息結構句柄的成員變數。
CAtlServiceModuleT::m_status 儲存目前服務狀態信息結構的成員變數。
CAtlServiceModuleT::m_szServiceName 要註冊的服務名稱。

備註

CAtlServiceModuleT衍生自 CAtlExeModuleT 的 ,會實作 ATL 服務模組。 CAtlServiceModuleT 提供命令行處理、安裝、註冊和移除的方法。 如果需要額外的功能,則可以覆寫這些和其他方法。

這個類別會取代舊版 ATL 中使用的過時 CComModule 類別 。 如需詳細資訊,請參閱 ATL 模組類別。

繼承階層架構

_ATL_MODULE

CAtlModule

CAtlModuleT

CAtlExeModuleT

CAtlServiceModuleT

需求

標頭: atlbase.h

CAtlServiceModuleT::CAtlServiceModuleT

建構函式。

CAtlServiceModuleT() throw();

備註

初始化數據成員,並設定初始服務狀態。

CAtlServiceModuleT::Handler

服務的處理程式例程。

void Handler(DWORD dwOpcode) throw();

參數

dwOpcode
定義處理程式作業的參數。 如需詳細資訊,請參閱。

備註

這是服務控制管理員 (SCM) 呼叫以擷取服務狀態的程式代碼,併發出停止或暫停等指示。 SCM 會傳遞如下所示的作業程序代碼,以 Handler 指出服務應該執行的動作。

作業程序代碼 意義
SERVICE_CONTROL_STOP 停止服務。 覆寫 atlbase.h 中 CAtlServiceModuleT::OnStop 方法來變更行為。
SERVICE_CONTROL_PAUSE 用戶已實作。 覆寫 atlbase.h 中的空白方法 CAtlServiceModuleT::OnPause 以暫停服務。
SERVICE_CONTROL_CONTINUE 用戶已實作。 覆寫 atlbase.h 中的空白方法 CAtlServiceModuleT::OnContinue 以繼續服務。
SERVICE_CONTROL_INTERROGATE 用戶已實作。 覆寫 atlbase.h 中的空白方法 CAtlServiceModuleT::OnInterrogate 來詢問服務。
SERVICE_CONTROL_SHUTDOWN 用戶已實作。 覆寫 atlbase.h 中的空白方法 CAtlServiceModuleT::OnShutdown 以關閉服務。

如果無法辨識作業程序代碼,則會呼叫 CAtlServiceModuleT::OnUnknownRequest 方法

默認 ATL 產生的服務只會處理停止指令。 如果 SCM 通過停止指令,服務會告訴 SCM 程式即將停止。 服務接著會呼叫 PostThreadMessage 來張貼結束訊息給自己。 這會終止訊息循環,服務最終會關閉。

CAtlServiceModuleT::InitializeSecurity

提供服務的預設安全性設定。

HRESULT InitializeSecurity() throw();

傳回值

傳回成功時S_OK,或在失敗時傳回錯誤 HRESULT。

備註

衍生自 CAtlServiceModuleT 的任何類別都必須在衍生類別中實作這個方法。

在對的呼叫 CoInitializeSecurity中使用 PKT 層級驗證、模擬RPC_C_IMP_LEVEL_IDENTIFY層級和適當的非 Null 安全性描述元。

針對精靈產生的非屬性服務專案,這會位於

class CNonAttribServiceModule : public CAtlServiceModuleT< CNonAttribServiceModule, IDS_SERVICENAME >
{
public :
   DECLARE_LIBID(LIBID_NonAttribServiceLib)
   DECLARE_REGISTRY_APPID_RESOURCEID(IDR_NONATTRIBSERVICE, "{29160736-339F-4A1C-ABEF-C320CE103E12}")
   HRESULT InitializeSecurity() throw()
   {
      // TODO : Call CoInitializeSecurity and provide the appropriate security settings for 
      // your service
      // Suggested - PKT Level Authentication, 
      // Impersonation Level of RPC_C_IMP_LEVEL_IDENTIFY 
      // and an appropriate Non NULL Security Descriptor.

      return S_OK;
   }
};

針對屬性化服務專案,這會位於

[ module(SERVICE, uuid = "{D3103322-7B70-4581-8E59-12769BD9A62B}", 
   name = "AttribService", 
   helpstring = "AttribService 1.0 Type Library", 
   resource_name="IDS_SERVICENAME") ]
class CAttribServiceModule
{
public:
   HRESULT InitializeSecurity() throw()
   {
      // TODO : Call CoInitializeSecurity and provide the appropriate security settings for 
      // your service
      // Suggested - PKT Level Authentication, 
      // Impersonation Level of RPC_C_IMP_LEVEL_IDENTIFY 
      // and an appropriate Non NULL Security Descriptor.

      return S_OK;
   }
};

CAtlServiceModuleT::Install

安裝並建立服務。

BOOL Install() throw();

傳回值

在成功時傳回 TRUE,失敗時傳回 FALSE。

備註

將服務安裝至服務控制管理員 (SCM) 資料庫,然後建立服務物件。 如果無法建立服務,則會顯示消息框,而且方法會傳回 FALSE。

CAtlServiceModuleT::IsInstalled

確認服務已安裝。

BOOL IsInstalled() throw();

傳回值

如果已安裝服務,則傳回 TRUE,否則傳回 FALSE。

CAtlServiceModuleT::LogEvent

寫入事件記錄檔。

void __cdecl LogEvent(LPCTSTR pszFormat, ...) throw();

參數

pszFormat
要寫入事件記錄檔的字串。

...
要寫入事件記錄檔的選擇性額外字串。

備註

這個方法會使用 ReportEvent 函式,將詳細數據寫出至事件記錄檔。 如果未執行任何服務,字串就會傳送至主控台。

CAtlServiceModuleT::m_bService

指出程式以服務身分執行的旗標。

BOOL m_bService;

備註

用來區分 Service EXE 與 Application EXE。

CAtlServiceModuleT::m_dwThreadID

儲存服務線程標識碼的成員變數。

DWORD m_dwThreadID;

備註

此變數會儲存目前線程的線程標識碼。

CAtlServiceModuleT::m_hServiceStatus

儲存目前服務之狀態信息結構句柄的成員變數。

SERVICE_STATUS_HANDLE m_hServiceStatus;

備註

SERVICE_STATUS 結構包含服務的相關信息。

CAtlServiceModuleT::m_status

儲存目前服務狀態信息結構的成員變數。

SERVICE_STATUS m_status;

備註

SERVICE_STATUS 結構包含服務的相關信息。

CAtlServiceModuleT::m_szServiceName

要註冊的服務名稱。

TCHAR [256] m_szServiceName;

備註

以 Null 結尾的字串,儲存服務的名稱。

CAtlServiceModuleT::OnContinue

覆寫此方法以繼續服務。

void OnContinue() throw();

CAtlServiceModuleT::OnInterrogate

覆寫此方法以詢問服務。

void OnInterrogate() throw();

CAtlServiceModuleT::OnPause

覆寫此方法以暫停服務。

void OnPause() throw();

CAtlServiceModuleT::OnShutdown

覆寫此方法以關閉服務。

void OnShutdown() throw();

CAtlServiceModuleT::OnStop

覆寫此方法以停止服務。

void OnStop() throw();

CAtlServiceModuleT::OnUnknownRequest

覆寫此方法以處理服務的未知要求。

void OnUnknownRequest(DWORD /* dwOpcode*/) throw();

參數

dwOpcode
已保留。

CAtlServiceModuleT::P arseCommandLine

剖析命令行,並視需要執行註冊。

bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw();

參數

lpCmdLine
命令列。

pnRetCode
對應至註冊的 HRESULT(如果發生的話)。

傳回值

如果命令行中提供的 RGS 檔案無法註冊,則會在成功時傳回 true,否則傳回 false。

備註

剖析命令行,並視需要註冊或取消註冊提供的 RGS 檔案。 此方法會呼叫 CAtlExeModuleT::P arseCommandLine 來檢查 /RegServer/UnregServer。 新增自變數 -/Service 將會註冊服務。

CAtlServiceModuleT::P reMessageLoop

在輸入訊息迴圈之前,會立即呼叫這個方法。

HRESULT PreMessageLoop(int nShowCmd) throw();

參數

nShowCmd
此參數會傳遞至 CAtlExeModuleT::P reMessageLoop

傳回值

傳回成功時S_OK,或在失敗時傳回錯誤 HRESULT。

備註

覆寫此方法以新增服務的自定義初始化程序代碼。

CAtlServiceModuleT::RegisterAppId

在登錄中註冊服務。

inline HRESULT RegisterAppId(bool bService = false) throw();

參數

bService
必須是 true,才能註冊為服務。

傳回值

傳回成功時S_OK,或在失敗時傳回錯誤 HRESULT。

CAtlServiceModuleT::Run

執行服務。

HRESULT Run(int nShowCmd = SW_HIDE) throw();

參數

nShowCmd
指定視窗的顯示方式。 此參數可以是 WinMain 區段中討論的其中一個值。 預設值為 SW_HIDE。

傳回值

傳回成功時S_OK,或在失敗時傳回錯誤 HRESULT。

備註

呼叫之後, Run 呼叫 CAtlServiceModuleT::P reMessageLoopCAtlExeModuleT::RunMessageLoopCAtlExeModuleT::P ostMessageLoop

CAtlServiceModuleT::ServiceMain

服務控制管理員會呼叫此方法。

void ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw();

參數

dwArgc
argc 自變數。

lpszArgv
argv 自變數。

備註

當您在 控制台 中開啟服務應用程式時,服務控制管理員 (SCM) 會呼叫 ServiceMain ,選取服務,然後按兩下 [啟動]。

在 SCM 呼叫 ServiceMain之後,服務必須為 SCM 提供處理程式函式。 此函式可讓 SCM 取得服務的狀態,並傳遞特定指示(例如暫停或停止)。 之後, 會呼叫 CAtlServiceModuleT::Run 來執行服務的主要工作。 Run 會繼續執行,直到服務停止為止。

CAtlServiceModuleT::SetServiceStatus

此方法會更新服務狀態。

void SetServiceStatus(DWORD dwState) throw();

參數

dwState
新狀態。 如需可能的值,請參閱 SetServiceStatus

備註

更新服務控制管理員的狀態資訊。 它會由 CAtlServiceModuleT::RunCAtlServiceModuleT::ServiceMain 和其他處理程式方法呼叫。 狀態也會儲存在成員變數 CAtlServiceModuleT::m_status中。

CAtlServiceModuleT::Start

服務啟動時由 CAtlServiceModuleT::WinMain 呼叫。

HRESULT Start(int nShowCmd) throw();

參數

nShowCmd
指定視窗的顯示方式。 此參數可以是 WinMain 區段中討論的其中一個值。

傳回值

傳回成功時S_OK,或在失敗時傳回錯誤 HRESULT。

備註

CAtlServiceModuleT::WinMain 方法會同時處理註冊和安裝,以及移除登錄專案和卸載模組所涉及的工作。 執行服務時, WinMain 呼叫 Start

CAtlServiceModuleT::Uninstall

停止並移除服務。

BOOL Uninstall() throw();

傳回值

在成功時傳回 TRUE,失敗時傳回 FALSE。

備註

停止服務執行,並將它從 Service Control Manager 資料庫移除。

CAtlServiceModuleT::Unlock

遞減服務的鎖定計數。

LONG Unlock() throw();

傳回值

傳回鎖定計數,這可能對診斷和偵錯很有用。

CAtlServiceModuleT::UnregisterAppId

從登錄中移除服務。

HRESULT UnregisterAppId() throw();

傳回值

傳回成功時S_OK,或在失敗時傳回錯誤 HRESULT。

CAtlServiceModuleT::WinMain

這個方法會實作啟動服務所需的程序代碼。

int WinMain(int nShowCmd) throw();

參數

nShowCmd
指定視窗的顯示方式。 此參數可以是 WinMain 區段中討論的其中一個值。

傳回值

傳回服務的傳回值。

備註

此方法會處理命令行(使用 CAtlServiceModuleT::P arseCommandLine),然後啟動服務(使用 CAtlServiceModuleT::Start)。

另請參閱

CAtlDllModuleT 類別
類別概觀