CAtlServiceModuleT 類別
這個類別會實作服務。
重要
這個類別及其成員不能用於在 Windows 執行階段 中執行的應用程式。
語法
template <class T, UINT nServiceNameID>
class ATL_NO_VTABLE CAtlServiceModuleT : public CAtlExeModuleT<T>
參數
T
衍生自 CAtlServiceModuleT
的類別。
nServiceNameID
服務的資源標識碼。
成員
公用建構函式
名稱 | 描述 |
---|---|
CAtlServiceModuleT::CAtlServiceModuleT | 建構函式。 |
公用方法
公用資料成員
名稱 | 描述 |
---|---|
CAtlServiceModuleT::m_bService | 指出程式以服務身分執行的旗標。 |
CAtlServiceModuleT::m_dwThreadID | 儲存線程標識碼的成員變數。 |
CAtlServiceModuleT::m_hServiceStatus | 儲存目前服務之狀態信息結構句柄的成員變數。 |
CAtlServiceModuleT::m_status | 儲存目前服務狀態信息結構的成員變數。 |
CAtlServiceModuleT::m_szServiceName | 要註冊的服務名稱。 |
備註
CAtlServiceModuleT
衍生自 CAtlExeModuleT 的 ,會實作 ATL 服務模組。 CAtlServiceModuleT
提供命令行處理、安裝、註冊和移除的方法。 如果需要額外的功能,則可以覆寫這些和其他方法。
這個類別會取代舊版 ATL 中使用的過時 CComModule 類別 。 如需詳細資訊,請參閱 ATL 模組類別。
繼承階層架構
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;
備註
CAtlServiceModuleT::m_status
儲存目前服務狀態信息結構的成員變數。
SERVICE_STATUS m_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 reMessageLoop、 CAtlExeModuleT::RunMessageLoop 和 CAtlExeModuleT::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::Run、 CAtlServiceModuleT::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)。