如何在系统重新启动时启动Windows服务停止事件?

问题描述:

我已经用VC++编写Windows Service来在系统重新启动时安装驱动器。 现在,当我重新启动系统,在系统关机时,我想激发我的服务停止事件,但未被触发。如何在系统重新启动时启动Windows服务停止事件?

我已将Windows服务属性设置为自动,但不起作用。 当我手动点击停止按钮停止事件被解雇。

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

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。大概是这样的:

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

OR:

注册与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文档中这些通知的警告。