如何在系统重新启动时启动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文档中这些通知的警告。