2008-11-15 85 views
1

我正在編寫一個服務應用程序,有時在從服務MMC接收到SERVICE_CONTROL_STOP時不能立即停止。我目前正在處理這件事是這樣的:(僞代碼):如何從服務中返回錯誤?

DWORD 
HandlerEx(
    DWORD dwControl, 
    DWORD dwEventType, 
    PVOID pvEventData, 
    PVOID pvContext 
) 
{ 
    switch(dwControl) 
    { 
    case SERVICE_CONTROL_STOP: 
     if (CanStopServiceNow()) 
     { 
      ReportStatus(SERVICE_STOP_PENDING); 
      DoStopService(); 
      ReportStatus(SERVICE_STOPPED); 
      return NO_ERROR; 
     } 
     else 
      return ERROR_BUSY; 
     break; 
    } 

    return NO_ERROR; 
} 

它運作良好,當服務可以停止(和它停止),但是,當它不能停止,我希望Windows能夠報告錯誤我回國(ERROR_BUSY在這個例子中)。相反,Windows會顯示一條消息說:

"The service did not return an error. 
This could be an internal Windows error or an internal service error." 

所以我的問題是,如何使服務報告回SCM,它現在不能停下來,讓MMC顯示器關於我要返回的實際錯誤代碼的消息?

回答

1

我知道這不會回答你的具體問題。但是,我認爲答案是「沒有辦法」。無論如何,我會提出一個建議。大多數需要對其啓動和關閉進行更多控制的應用程序,我可以想到Sap和Oracle,將windows服務用作管理服務,並實施gui或命令行界面來啓動和停止實際的「工作進程」。

+0

這正是我正在做的。但是這並不能回答我的問題,對不起。 – 2008-11-15 23:04:15

1

回答我自己的問題(更詳細地研究問題之後):服務應該向SCM報告其狀態,而不是從SERVICE HandlerEx函數返回錯誤代碼,以指示它是否可以接受SERVICE_CONTROL_STOP代碼。如果服務檢測到它不能立即停止,它應該清除SERVICE_STATUS結構中的SERVICE_ACCEPT_STOP位並調用SetServiceStatus()。這應該可以防止SCM試圖首先停止服務。當條件清除並且服務決定可以安全停止時,它應該設置SERVICE_ACCEPT_STOP位並再次調用SetServiceStatus()。