我的服务不会停止

发布于 2024-12-07 18:07:15 字数 2533 浏览 0 评论 0原文

每当我尝试通过服务管理器停止服务时,都会收到以下错误,并且服务保持启动状态。 “无法停止本地计算机上的服务。该服务没有返回错误。这可能是内部 Windows 错误或内部服务错误。” 我在这个问题上遇到了很大的麻烦,所以我试图尽可能地遵循微软的逻辑。 http://msdn.microsoft。 com/en-us/library/windows/desktop/bb540474(v=vs.85).aspx 如果您搜索一下,您会发现 .Net 1.1 中存在类似的问题;但是,我根本不使用框架。

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

厌倦 2024-12-14 18:07:15

运行服务,然后将调试器附加到正在运行的进程。在 serviceCtrlHandler 处和 WaitForSingleObject(stopEvent, INFINITE) 之后放置一个断点 - 确保您认为应该发生的事情确实发生。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文