Winapi 如何修复自定义服务禁用的服务控制按钮
我启动了一个服务&它工作正常(我通过查看它发布的事件日志消息来验证它是否正在运行)。但是由于某种原因,services.msc显示的停止按钮变灰了&我不知道为什么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) {
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。这是我正在执行的大致操作的示例伪代码-没有测试它是否实际编译。