SERVICE_STATUS結構各成員解析


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

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。這個成員的值在服務的生存期內絕對不應該改變。

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

dwControlsAccepted:指明服務接受什么樣的控制通知。如果允許一個服務控制程序(SCP)去暫停/繼續服務,就把它設成SERVICE_ACCEPT_PAUSE_CONTINUE。很多服務不支持暫停或繼續,就必須自己決定在服務中它是否可用。如果你允許一個SCP去停止服務,就要設置它為SERVICE_ACCEPT_STOP。如果服務要在操作系統關閉的時候得到通知,設置它為SERVICE_ACCEPT_SHUTDOWN可以收到預期的結果。這些標志可以用“|”運算符組合。

dwWin32ExitCode和dwServiceSpecificExitCode:是允許服務報告錯誤的關鍵,如果希望服務去報告一個Win32錯誤代碼(預定義在WinError.h中),它就設置dwWin32ExitCode為需要的代碼。一個服務也可以報告它本身特有的、沒有映射到一個預定義的Win32錯誤代碼中的錯誤。為了這一點,要把dwWin32ExitCode設置為ERROR_SERVICE_SPECIFIC_ERROR,然后還要設置成員dwServiceSpecificExitCode為服務特有的錯誤代碼。當服務運行正常,沒有錯誤可以報告的時候,就設置成員dwWin32ExitCode為NO_ERROR。

dwCheckPoint和dwWaitHint:是一個服務用來報告它當前的事件進展情況的。當成員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 theSetServiceStatus function with either an incremented dwCheckPoint value or a change indwCurrentState. If the amount of time specified by dwWaitHint passes, and dwCheckPoint has not been incremented or dwCurrentState 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)將假設一個錯誤已經發生,且服務應該停止。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM