如何在系统重启时触发 Windows 服务停止事件? [英] How to Fire Windows Service stop event on System restart?

查看:47
本文介绍了如何在系统重启时触发 Windows 服务停止事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经用 VC++ 编写了 Windows 服务来在系统重启时挂载驱动器.现在,当我重新启动系统时,在系统关闭时,我想触发未触发的服务停止事件.

I have written Windows Service in VC++ to mount Drives on System restart. Now when i restart the system, on system shutdown i want to fire my service stop event which is not getting fired.

我已将 Windows 服务属性设置为自动,但它不起作用.当我手动点击停止按钮时,停止事件被触发.

I have set Windows service properties as automatic but it does not work. When i manually click on stop button stop event get fired.

感谢任何帮助.我的代码看起来像:

Any help is apprecaited. My code looks like :

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
  switch(Opcode)
  {
    case SERVICE_CONTROL_PAUSE: 
      m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
      break;
    case SERVICE_CONTROL_CONTINUE:
      m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
      break;
    case SERVICE_CONTROL_STOP:
      m_ServiceStatus.dwWin32ExitCode = 0;
      m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
      m_ServiceStatus.dwCheckPoint = 0;
      m_ServiceStatus.dwWaitHint = 0;

     Disconnect() ;// This method i want to get called on system shot down automatically.

      SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
      bRunning=false;
      break;
    case SERVICE_CONTROL_INTERROGATE:
      break; 
  }
  return;
}

推荐答案

这相对简单.通过向 switch 语句添加另一个 case 来处理当前回调处理函数中的 SERVICE_CONTROL_SHUTDOWN.大概是这样的:

This is relatively straight forward. Either handle the SERVICE_CONTROL_SHUTDOWN in your current callback handler function by adding another case to the switch statement. Probably something like:

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
  switch(Opcode)
  {
    case SERVICE_CONTROL_PAUSE: 
      m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
      break;
    case SERVICE_CONTROL_CONTINUE:
      m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
      break;
    case SERVICE_CONTROL_STOP:
      m_ServiceStatus.dwWin32ExitCode = 0;
      m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
      m_ServiceStatus.dwCheckPoint = 0;
      m_ServiceStatus.dwWaitHint = 0;

     Disconnect() ;// This method i want to get called on system shot down automatically.

      SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
      bRunning=false;
      break;
    case SERVICE_CONTROL_INTERROGATE:
      break; 

    case SERVICE_CONTROL_SHUTDOWN:
        Disconnect();
        break;
  }
  return;
}

或:

不要使用 RegisterServiceCtrlHandler 注册回调函数,而是使用 RegisterServiceCtrlHandlerEx.这种新的回调方法是首选.您的回调函数的签名需要匹配 HandlerEx,请参阅 MSDN了解更多信息.

Instead of registering the callback function with RegisterServiceCtrlHandler use RegisterServiceCtrlHandlerEx. This new callback method is preferred. Your callback function's signature needs to match HandlerEx, see MSDN for more info.

DWORD WINAPI HandlerEx(
  __in  DWORD dwControl,
  __in  DWORD dwEventType,
  __in  LPVOID lpEventData,
  __in  LPVOID lpContext
);

向您的 switch 语句添加另一个 case,SERVICE_CONTROL_PRESHUTDOWN(在 XP/Server 2003 上不可用)或 SERVICE_CONTROL_SHUTDOWN,请阅读上面引用的 HandlerEx 文档中有关处理这些通知的警告.

Add another case to your switch statement, either SERVICE_CONTROL_PRESHUTDOWN (not available on XP/Server 2003) or SERVICE_CONTROL_SHUTDOWN, read the warnings about handling these notifications in the HandlerEx documentation referenced above.

这篇关于如何在系统重启时触发 Windows 服务停止事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆