创建服务(SERVICE_ACCEPT_SESSIONCHANGE)

时间:2010-04-27 16:30:03

标签: windows winapi service

我正在尝试按照以下链接中记录的示例创建服务: 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中向后兼容将是一个额外的好处。

任何人都可以提出建议吗? 提前谢谢你,

罗恩

2 个答案:

答案 0 :(得分:1)

MSDN says:SERVICE_ACCEPT_SESSIONCHANGE:“Windows 2000:不支持此值。”

不确定这是否是服务在启动阶段陷入困境的实际原因。

编辑:在Windows 2000上获取会话事件的其他方法:

答案 1 :(得分:1)

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

没有那么有用,我知道,但至少你知道你应该能够按照记录的方式让它工作......我的服务代码比你在那里的基本例子复杂得多,所以我看不到一眼就看出你犯了什么错误。

由于您没有看到停止可用作为选项,我会检查您是否正确设置了控件,或者只是将其更改为停止并确保您在启动时看到停止作为选项服务......