gpt4 book ai didi

windows - 创建服务 (SERVICE_ACCEPT_SESSIONCHANGE)

转载 作者:可可西里 更新时间:2023-11-01 10:29:57 25 4
gpt4 key购买 nike

我正在尝试按照以下链接中记录的示例创建服务: http://msdn.microsoft.com/en-us/library/bb540475(v=VS.85).aspx

我感兴趣的是能够捕获用户“锁定”和“解锁”工作站事件。

使用提供的示例中的代码,我修改了以下内容:

第 15 行:

原文:

VOID WINAPI SvcCtrlHandler( DWORD );

修改:

DWORD WINAPI SvcCtrlHandler( DWORD, DWORD, LPVOID, LPVOID );

第 141 行:

原文:

gSvcStatusHandle = RegisterServiceCtrlHandler( SVCNAME, SvcCtrlHandler);

修改:

gSvcStatusHandle = RegisterServiceCtrlHandlerEx( SVCNAME, SvcCtrlHandler, NULL);

第 244 行:

原文:

gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;

修改:

gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SESSIONCHANGE;

第 266 行:

原文:

VOID WINAPI SvcCtrlHandler( DWORD dwCtrl )
{
// Handle the requested control code.

switch(dwCtrl)
{
case SERVICE_CONTROL_STOP:
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);

// Signal the service to stop.

SetEvent(ghSvcStopEvent);
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);

return;

case SERVICE_CONTROL_INTERROGATE:
break;

default:
break;
}
}

修改:

DWORD WINAPI SvcCtrlHandler( DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext )
{
DWORD dwErrorCode = NO_ERROR;

switch(dwControl)
{
case SERVICE_CONTROL_STOP:
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);

// Signal the service to stop.

SetEvent(ghSvcStopEvent);
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
break;

case SERVICE_CONTROL_INTERROGATE:
break;

case SERVICE_CONTROL_SESSIONCHANGE:
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
break;

default:
break;
}

return dwErrorCode;
}

通过上述更改,我的服务可以正常编译和安装。

我尝试在 Windows 7 机器上启动我的服务,它会正常启动(但我将无法停止、暂停或对服务执行任何操作,因为所有选项都将被禁用)。

我也在我的 Windows 2000 机器上试过我的服务,它甚至没有启动(它会停留在“正在启动”状态)

我的主要目标是让服务在 Windows 7 环境中正常运行,让它在 Windows 2000 中向后兼容将是一个奖励。

谁能给个建议?提前谢谢你,

罗恩

最佳答案

我这里有一个测试服务,它接受 session 更改事件并在 Windows 7 上运行得很好。它支持所有可能的通知并正确地允许停止和暂停并处理 session 更改事件。

我知道没那么有用,但至少你知道你应该能够让它按照文档说明工作......我的服务代码比你那里的基本示例复杂得多,所以我看不到一目了然你犯了什么错误。

由于您没有看到停止作为一个选项可用,我会检查您是否设置了正确接受的控件,或者将其更改回只是停止并确保您在开始后看到停止作为一个选项服务...

关于windows - 创建服务 (SERVICE_ACCEPT_SESSIONCHANGE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2723029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com