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 显示有关我返回的实际错误代码的消息?

4

2 回答 2

1

我知道这不会回答您的具体问题。但我认为答案是“没有办法”。无论如何我都会提出建议。大多数需要对其启动和关闭进行更多控制的应用程序,我可以想到 Sap 和 Oracle,将 windows 服务用作管理服务,并实现 gui 或命令行界面来启动和停止实际的“工作进程”。

于 2008-11-15T22:51:34.377 回答
1

回答我自己的问题(在更详细地调查问题之后):服务不应从 HandlerEx 函数返回错误代码,而应将其状态报告给 SCM,指示它是否可以接受 SERVICE_CONTROL_STOP 代码。如果服务检测到无法立即停止,则应清除其 SERVICE_STATUS 结构中的 SERVICE_ACCEPT_STOP 位并调用 SetServiceStatus()。这应该可以防止 SCM 首先尝试停止服务。当条件清除并且服务决定可以安全停止时,它应该设置 SERVICE_ACCEPT_STOP 位并再次调用 SetServiceStatus()。

于 2008-11-17T18:14:55.447 回答