2016-09-15 81 views
0

SERVICE_STATUS documentation表示在調用SetServiceStatus()函數時必須填寫此結構。在服務的控制處理程序中實現了哪些控制代碼

第三個字段是dwControlsAccepted

很抱歉,我至少沒有找到任何有關哪些控制代碼必須始終被實施/反應的信息。

頁說:

默認情況下,所有的服務接受SERVICE_CONTROL_INTERROGATE值。

但是,當服務控制處理程序不響應SERVICE_CONTROL_STOP控制代碼時,是否有問題?在這種情況下,服務控制處理程序沒有至少調用SetServiceStatus()是否有問題?

回答

3

dwControlsAccepted而言,沒有強制性控制代碼。如果滿足您的需求,您可以將此值設置爲零。除了SERVICE_CONTROL_INTERROGATE之外,您的代碼不需要處理您未指定爲可接受的任何控制代碼。

例如,如果您尚未設置SERVICE_ACCEPT_STOP,則Windows永遠不會向您發送SERVICE_CONTROL_STOP控件。任何停止服務的嘗試都將導致錯誤1052,「所請求的控件對此服務無效」。

需要注意的是,除非你有特殊需要執行一個乾淨關閉(例如,因爲你有必須被正確地關閉數據庫文件)你需要接受的關斷控制無論是。這種服務將繼續運行,直到電腦實際關機。

如果你總是設置dwControlsAccepted爲零,這是所有你需要一個控制處理器:

static DWORD WINAPI ServiceHandlerEx(DWORD control, DWORD eventtype, LPVOID lpEventData, LPVOID lpContext) 
{ 
    if (control == SERVICE_CONTROL_INTERROGATE) 
    { 
     return NO_ERROR; 
    } 
    else 
    { 
     return ERROR_CALL_NOT_IMPLEMENTED; 
    } 
}