Winapi 如何修复自定义服务禁用的服务控制按钮

Winapi 如何修复自定义服务禁用的服务控制按钮,winapi,windows-services,Winapi,Windows Services,我启动了一个服务&它工作正常(我通过查看它发布的事件日志消息来验证它是否正在运行)。但是由于某种原因,services.msc显示的停止按钮变灰了&我不知道为什么 static SERVICE_STATUS_HANDLE gServiceStatusHandle = NULL; static DWORD WINAPI DaemonServiceHandler(DWORD control, DWORD eventType, LPVOID eventData, LPVOID context) {

我启动了一个服务&它工作正常(我通过查看它发布的事件日志消息来验证它是否正在运行)。但是由于某种原因,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;
}
static SERVICE\u STATUS\u HANDLE gServiceStatusHandle=NULL;
静态DWORD WINAPI守护程序服务处理程序(DWORD控件、DWORD事件类型、LPVOID事件数据、LPVOID上下文)
{
HANDLE stopEvent=重新解释(上下文);
开关(控制){
案例服务控制站:
ReportServiceStatus(服务停止挂起,1003000);
//通知主循环停止
返回无错误;
案件服务(控制)(调查):
返回无错误;
}
返回错误\u调用\u未执行;
}
void WINAPI DaemonMain(DWORD argc,LPWSTR*argv)
{
gServiceStatusHandle=RegisterServiceCtrlHandlerEx(WIN_UTF16(gServiceName),守护服务处理器,NULL);
if(gsServiceStatusHandle==NULL){
报告服务(服务已停止);
回来
}
报告服务(服务运行);
//do主回路
报告服务(服务已停止);
}
内部tmain(内部argc、tchar**argv)
{
常数服务表入口调度表[]=
{
{(L“MyService”,DaemonMain},
{NULL,NULL}
};
如果(!StartServiceCtrlDispatcherW(调度表)){
返回1;
}
返回0;
}

我的ReportServiceStatus调用中的错误


当要报告的当前状态不是SERVICE\u START\u PENDING时,我将服务\u STATUS\u句柄的DWControlsAccept设置为0 always,而不是启用SERVICE\u ACCEPT\u STOP。

这是我正在执行的大致操作的示例伪代码-没有测试它是否实际编译。