简体   繁体   中英

My service won't stop

Whenever I try to stop my service through the services manager, I get the following error and the service stays in a started state. "Could not stop the service on Local Computer. The service did not return an error. This could be an internal Windows error or an internal service error." I've had such trouble with this issue that I tried to follow the logic from Microsoft as best as I could. http://msdn.microsoft.com/en-us/library/windows/desktop/bb540474(v=vs.85).aspx There is a similar issue with this in .Net 1.1 that you'll find if you search; however, I'm not using the framweork at all.

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);
}

Run the service and then attach the debugger to the running process. Put a breakpoint at the serviceCtrlHandler and after the WaitForSingleObject(stopEvent, INFINITE) -- make sure what you think should happen does.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM