Как исправить сервисные кнопки управления отключены для пользовательского сервиса - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть служба, которую я запускаю, и она работает нормально (я проверяю, работает ли она, просматривая сообщения EventLog, которые она публикует). По какой-то причине, services.msc отображает кнопку остановки серым, и я не могу понять, почему.

static SERVICE_STATUS_HANDLE gServiceStatusHandle = NULL;

static DWORD WINAPI DaemonServiceHandler(DWORD control, DWORD eventType, LPVOID eventData, LPVOID context)
{
    HANDLE stopEvent = reinterpret_cast<HANDLE>(context);

    switch (control) {
    case SERVICE_CONTROL_STOP:
        ReportServiceStatus(SERVICE_STOP_PENDING, 100, 3000);
        // notify main loop to stop
        return NO_ERROR;
    case SERVICE_CONTROL_INTERROGATE:
        return NO_ERROR;
    }
    return ERROR_CALL_NOT_IMPLEMENTED;
}

void WINAPI DaemonMain(DWORD argc, LPWSTR *argv)
{
    gServiceStatusHandle = RegisterServiceCtrlHandlerEx(WIN_UTF16(gServiceName), DaemonServiceHandler, NULL);
    if (gServiceStatusHandle == NULL) {
        ReportService(SERVICE_STOPPED);
        return;
    }
    ReportService(SERVICE_RUNNING);
    // do main loop
    ReportService(SERVICE_STOPPED);
}

int tmain(int argc, tchar **argv)
{
    const SERVICE_TABLE_ENTRYW DispatchTable[] =
    {
        {(L"MyService", DaemonMain},
        {NULL, NULL}
    };
    if (!StartServiceCtrlDispatcherW(DispatchTable)) {
        return 1;
    }
    return 0;
}

1 Ответ

0 голосов
/ 15 ноября 2011

Ошибка в моем вызове ReportServiceStatus.

Я всегда устанавливал dwControlsAccepted из SERVICE_STATUS_HANDLE в 0 вместо того, чтобы включать SERVICE_ACCEPT_STOP, когда текущее состояние отчета не было SERVICE_START_PENDING.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...