我正在尝试按照以下链接中记录的示例创建服务:http://msdn.microsoft.com/en-us/library/bb540475(v=VS.85).aspx http://msdn.microsoft.com/en-us/library/bb540475(v=VS.85).aspx
我感兴趣的是能够捕获用户“锁定”和“解锁”工作站事件。
使用提供的示例中的代码,我修改了以下内容:
Line 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 中向后兼容将是一个额外的好处。
有人可以建议吗?
先感谢您,
Ron