我正在尝试按照以下链接中记录的示例创建服务: 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中向后兼容将是一个额外的好处。
任何人都可以提出建议吗? 提前谢谢你,
罗恩
答案 0 :(得分:1)
MSDN says:SERVICE_ACCEPT_SESSIONCHANGE:“Windows 2000:不支持此值。”
不确定这是否是服务在启动阶段陷入困境的实际原因。
编辑:在Windows 2000上获取会话事件的其他方法:
答案 1 :(得分:1)
我在这里有一个接受会话更改事件的测试服务,并且在Windows 7上运行正常。它支持所有可能的通知,并且正确地允许停止和暂停并处理会话更改事件。
没有那么有用,我知道,但至少你知道你应该能够按照记录的方式让它工作......我的服务代码比你在那里的基本例子复杂得多,所以我看不到一眼就看出你犯了什么错误。
由于您没有看到停止可用作为选项,我会检查您是否正确设置了控件,或者只是将其更改为停止并确保您在启动时看到停止作为选项服务......