【问题标题】:How to Fire Windows Service stop event on System restart?如何在系统重启时触发 Windows 服务停止事件?
【发布时间】:2011-03-11 05:25:52
【问题描述】:

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

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

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

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;
}

【问题讨论】:

    标签: visual-c++ windows-services


    【解决方案1】:

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

    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, see MSDN for more info

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多