Как вернуть ошибку из сервиса? - PullRequest
1 голос
/ 16 ноября 2008

Я пишу служебное приложение, которое иногда невозможно остановить сразу же после получения SERVICE_CONTROL_STOP от MMC служб. В настоящее время я обрабатываю это так: (в псевдокоде):

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 отображать сообщение о фактическом коде ошибки, который я возвращаю?

Ответы [ 2 ]

1 голос
/ 17 ноября 2008

Отвечая на мой собственный вопрос (после более подробного изучения проблемы): вместо того, чтобы возвращать код ошибки из функции HandlerEx, служба должна сообщить о своем состоянии в SCM, указывая, может ли она принять код SERVICE_CONTROL_STOP. Если служба обнаруживает, что ее нельзя остановить немедленно, она должна очистить бит SERVICE_ACCEPT_STOP в своей структуре SERVICE_STATUS и вызвать SetServiceStatus (). Это должно предотвратить попытки SCM остановить службу в первую очередь. Когда условие сбрасывается, и служба решает, что ее безопасно остановить, она должна установить бит SERVICE_ACCEPT_STOP и снова вызвать SetServiceStatus ().

1 голос
/ 16 ноября 2008

Я знаю, что это не ответит на ваш конкретный вопрос. Но так как я думаю, что ответ «Нет пути». Я сделаю предложение в любом случае. Большинство приложений, которым требуется больше контроля над их запуском и закрытием, я могу думать о Sap и Oracle, использую службу Windows в качестве службы администрирования и реализую интерфейс графического интерфейса пользователя или командной строки для запуска и остановки реального «рабочего процесса». *

...