Это относительно просто.
Либо обработайте SERVICE_CONTROL_SHUTDOWN в текущей функции обработчика обратного вызова, добавив еще один случай в оператор switch. Возможно что-то вроде:
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, для получения дополнительной информации см. MSDN .
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, упомянутой выше.