Мой сервис не остановится - PullRequest
0 голосов
/ 04 октября 2011

Всякий раз, когда я пытаюсь остановить свою службу через диспетчер служб, я получаю следующую ошибку, и служба остается в запущенном состоянии. «Не удалось остановить службу на локальном компьютере. Служба не вернула ошибку. Это может быть внутренняя ошибка Windows или внутренняя ошибка службы». У меня были такие проблемы с этой проблемой, что я старался следовать логике Microsoft как можно лучше. http://msdn.microsoft.com/en-us/library/windows/desktop/bb540474(v=vs.85).aspx В .Net 1.1 есть похожая проблема, которую вы найдете, если будете искать; однако я вообще не использую framweork.

void WINAPI serviceCtrlHandler(DWORD dwCtrl )
{

    switch(dwCtrl)
    {
        case SERVICE_CONTROL_STOP:
            ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
            SetEvent(stopEvent); 
            ReportSvcStatus(serviceStatus->dwCurrentState, NO_ERROR, 0);

            return;
        case SERVICE_CONTROL_INTERROGATE:
            break;
        default:
            break;
    }
}

void WINAPI startMain(DWORD argc, LPTSTR *argv)
{
    serviceStatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, serviceCtrlHandler);

    serviceStatus->dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    serviceStatus->dwServiceSpecificExitCode = NO_ERROR;

    if (serviceStatusHandle == 0)
    {
        debug->DebugMessage(L"RegisterServiceCtrlHandler() failed, error: " + Error::GetErrorMessageW(GetLastError()));
        return;
    }

    ReportSvcStatus(SERVICE_START_PENDING, NO_ERROR, 3000);

    if (!SetServiceStatus(serviceStatusHandle, serviceStatus))
    {
        //debug->DebugMessage(L"SetserviceStatus() failed, error: " + Error::GetErrorMessageW(GetLastError()));
        //return;
    }

    stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    ReportSvcStatus(SERVICE_RUNNING, NO_ERROR, 0);

    boost::thread dust_main_thread(dust_main);

    while(1)
    {
        WaitForSingleObject(stopEvent, INFINITE);

        ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0);
        return;
    }

}

VOID ReportSvcStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint)
{
    static DWORD dwCheckPoint = 1;

    serviceStatus->dwCurrentState = dwCurrentState;
    serviceStatus->dwWin32ExitCode = dwWin32ExitCode;
    serviceStatus->dwWaitHint = dwWaitHint;

    if (dwCurrentState == SERVICE_START_PENDING)
        serviceStatus->dwControlsAccepted = 0;
    else serviceStatus->dwControlsAccepted = SERVICE_ACCEPT_STOP;

    if ((dwCurrentState == SERVICE_RUNNING) || (dwCurrentState == SERVICE_STOPPED))
        serviceStatus->dwCheckPoint = 0;
    else 
        serviceStatus->dwCheckPoint = dwCheckPoint++;

    SetServiceStatus(serviceStatusHandle, serviceStatus);
}

1 Ответ

0 голосов
/ 04 октября 2011

Запустите службу и затем присоедините отладчик к запущенному процессу. Поставьте точку останова на serviceCtrlHandler и после WaitForSingleObject (stopEvent, INFINITE) - убедитесь, что то, что, по вашему мнению, должно произойти, *. 1001 *

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