开发者

My service won't stop

开发者 https://www.devze.com 2023-04-10 20:39 出处:网络
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 theservice on Local Computer.The service did not ret

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 lo开发者_Go百科gic 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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号