【问题标题】:How to fix service control buttons are disabled for custom service如何修复自定义服务禁用服务控制按钮
【发布时间】:2011-11-15 07:59:38
【问题描述】:

我启动了一项服务,它运行良好(我通过查看它发布的 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;
}

【问题讨论】:

  • 这是我正在做的大致的示例伪代码 - 没有测试它是否真的可以编译。

标签: winapi windows-services


【解决方案1】:

我的 ReportServiceStatus 调用中的错误。

当要报告的当前状态不是 SERVICE_START_PENDING 时,我始终将 SERVICE_STATUS_HANDLE 的 dwControlsAccepted 设置为 0,而不是启用 SERVICE_ACCEPT_STOP。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多