SERVICE_STATUS結構各成員解析

在編寫Windows服務的時候,須要調用API函數::SetServiceStatus()向服務控制管理器(SCM)提交更新當前服務的狀態信息, 其第2個參數爲指向SERVICE_STATUS結構的指針,SERVICE_STATUS結構中包含了表示當前服務狀態的信息,對其各成員一一分析:html

typedef struct _SERVICE_STATUS {
 DWORD dwServiceType;
 DWORD dwCurrentState;
 DWORD dwControlsAccepted;
 DWORD dwWin32ExitCode;
 DWORD dwServiceSpecificExitCode;
 DWORD dwCheckPoint;
 DWORD dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;函數

dwServiceType:指明服務可執行文件的類型。若是可執行文件中只有一個單 獨的服務,就把這個成員設置成SERVICE_WIN32_OWN_PROCESS;若是擁有多個服務的話,就設置成 SERVICE_WIN32_SHARE_PROCESS。除了這兩個標誌以外,若是你的服務須要和桌面發生交互(固然不推薦這樣作),就要用「|」運算 符附加上SERVICE_INTERACTIVE_PROCESS。這個成員的值在服務的生存期內絕對不該該改變。ui

dwCurrentState:用於通知SCM此服務的現行狀態。爲了報告服務仍在初始化,應該把這個成員設置成SERVICE_START_PENDING。spa

dwControlsAccepted:指明服務接受什麼樣的控制通知。若是容許一個 服務控制程序(SCP)去暫停/繼續服務,就把它設成SERVICE_ACCEPT_PAUSE_CONTINUE。不少服務不支持暫停或繼續,就必須自 己決定在服務中它是否可用。若是你容許一個SCP去中止服務,就要設置它爲SERVICE_ACCEPT_STOP。若是服務要在操做系統關閉的時候獲得 通知,設置它爲SERVICE_ACCEPT_SHUTDOWN能夠收到預期的結果。這些標誌能夠用「|」運算符組合。操作系統

dwWin32ExitCodedwServiceSpecificExitCode:是 容許服務報告錯誤的關鍵,若是但願服務去報告一個Win32錯誤代碼(預約義在WinError.h中),它就設置dwWin32ExitCode爲須要 的代碼。一個服務也能夠報告它自己特有的、沒有映射到一個預約義的Win32錯誤代碼中的錯誤。爲了這一點,要把dwWin32ExitCode設置爲 ERROR_SERVICE_SPECIFIC_ERROR,而後還要設置成員dwServiceSpecificExitCode爲服務特有的錯誤代碼。當服務運行正常,沒有錯誤能夠報告的時候,就設置成員dwWin32ExitCode爲NO_ERROR。指針

dwCheckPointdwWaitHint:是 一個服務用來報告它當前的事件進展狀況的。當成員dwCurrentState被設置成SERVICE_START_PENDING的時候,應該把 dwCheckPoint設成0,dwWaitHint設成一個通過屢次嘗試後肯定比較合適的超時毫秒數,這樣服務才能高效運行。一旦服務被徹底初始化, 就應該從新初始化SERVICE_STATUS結構的成員,更改dwCurrentState爲SERVICE_RUNNING,而後把 dwCheckPoint和dwWaitHint都改成0。【MSDN:Estimated time required for a pending start, stop, pause, or continue operation, in milliseconds. Before the specified amount of time has elapsed, the service should make its next call to the SetServiceStatus function with either an incrementeddwCheckPoint value or a change in dwCurrentState. If the amount of time specified by dwWaitHint passes, anddwCheckPoint has not been incremented ordwCurrentState has not changed, the service control manager or service control program can assume that an error has occurred and the service should be stopped.】在dwWaitHint指定的超時時間到達以前,服務應該進行新的一次::SetServiceStatus()函數的調用,遞增 dwCheckPoint或者改變dwCurrentState,若是dwWaitHint指定的超時時間已通過去(已經超時),既沒有遞增 dwCheckPoint,又沒有改變dwCurrentState,則服務控制管理器(SCM)或者服務控制程序(SCP)將假設一個錯誤已經發生,且 服務應該中止。htm

相關文章
相關標籤/搜索