2008-11-15 86 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()。