VC++ Service程式設計(四)服務ServiceMain函式
當一個服務控制程式請求開啟一個新的服務時,SCM(服務控制管理器)開啟服務的同時,向控制排程器傳送一個開始請求。控制排程器為服務建立一個新的執行緒來執行ServiceMain函式。
ServiceMain函式應該執行下面的這些任務:
1、立刻為服務呼叫RegisterServiceCtrlHandlerEx函式,用來註冊一個處理控制請求的HandlerEx函式。RegisterServiceCtrlHandlerEx函式的返回值是一個service status handle(服務狀態控制代碼),稍後向SCM通知當前服務狀態會用到。
2、執行初始化。如果初始化的時間非常短(小於一秒),可以直接在ServiceMain函式中完成。
如果預期初始化的時間會比一秒長,呼叫SetServiceStatus函式,在SERVICE_STATUS結構中指明等待間隔,以及當前的狀態是SERVICE_START_PENDING。當初始化繼續時,服務應該再呼叫SetServiceStatus函式來報告當前狀態。多次呼叫SetServiceStatus函式對除錯服務很有用。
3、初始化結束後,呼叫SetServiceStatus函式,在SERVICE_STATUS結構中指明SERVICE_RUNNING狀態。
4、執行服務的任務,或者已經沒有未完成的任務,那就返回。服務狀態有任何改變,都要保證呼叫SetServiceStatus函式來報告新的狀態。
5、如果在初始化或者執行的過程中遇到錯誤並且清理的過程會很長,服務應該呼叫SetServiceStatus函式,在SERVICE_STATUS結構中指定SERVICE_STOP_PENDING狀態。一旦清理結束,在最後中止的執行緒中呼叫SetServiceStatus函式,在SERVICE_STATUS結構中指定SERVICE_STOPPED狀態。確保向SERVICE_STATUS結構裡的dwServiceSpecificExitCode和dwWin32ExitCode賦值,來標誌錯誤。