가장 큰 문제는 ATL이 RegisterServiceCtrlHandler
대신 RegisterServiceCtrlHandlerEx
사용한다는 것입니다; 두 번째 것만이 실제로 SERVICE_CONTROL_PRESHUTDOWN
메시지를 등록합니다. 또한 ATL에는 OnPreShutdown()에 대한 상속 가능한 템플릿이 없습니다.
용액 따라서 네 부분이다
(1) SERVICE_ACCEPTED_PRESHUTDOWN
메시지를 포함하는 수락 제어 메시지의 목록을 업데이트. SERVICE_ACCEPTED_SHUTDOWN
은 Windows가 사전 종료를 처리 한 후에 서비스가 종료 된 것으로 간주하므로이 메시지를받지 못할 수 있으므로 제거 할 수 있습니다. 내가 변경
: m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
사람 : 내 경우에는 변경은 무시 PreMessageLoop()
방법에 설정 제어 목록에 있었다이 메소드를 오버라이드 (override)하지 않았을 수 그러나 m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PRESHUTDOWN;
- 그래서 당신은 단순히해야 이 값을 설정하는 모든 지점에서 해당 목록을 변경하십시오. (IInspectable는 (다른 답을 참조)을 고려 생성자 권장합니다.)
(2) ServiceMain()
무시 코드를 복제하고 RegisterServiceCtrlHandlerEx
를 사용하도록 업데이트하여 완전히 교체.주요 변경 사항은 다음과 같습니다
변경 : m_hServiceStatus = RegisterServiceCtrlHandler(m_szServiceName, _Handler);
에 : m_hServiceStatus = RegisterServiceCtrlHandlerEx(m_szServiceName, (LPHANDLER_FUNCTION_EX)_Handler, NULL);
하지만 당신은 또한 템플릿 코드를 제거하기 위해 this
을 할 pT
및 T
에 대한 참조를 변경해야합니다 (당신은 또한 제거 할 수 있습니다 라인은 pT
을 정의 함);
변경 : hr = T::InitializeCom();
사람 : 예를 들어 hr = this->InitializeCom();
(이 RegisterServiceCtrlHandler
호출을 포함하는 것처럼) 하지 기본 클래스에 대한 호출을 포함 마십시오.
(3) 덮어 쓰기 및 확장 Handler()
. 이 같은 새로운 코드를 추가해야합니다 : (.이 비트에 올바른 방향으로 날 가리 도와 주셔서 IInspectable 덕분에 (다른 대답을 참조))
void CServiceModule::Handler(_In_ DWORD dwOpcpde) throw()
{
switch (dwOpcode)
{
case SERVICE_CONTROL_PRESHUTDOWN:
this->OnPreShutdown();
break;
default:
__super::Handler(dwOpcode);
break;
}
}
을 (4)
당신이 할 수있는 Windows가 당신이 그것을 사용하는 경우 서비스가 사전 종료시 중지하고, 위의 구현되면 서비스가 어떤을받을 것으로 기대
void CServiceModule::OnPreShutdown() throw()
{
// custom handling code
// ...
// note: service must shutdown in this handler, so finish
// by notifying this to SCM.
SetServiceStatus(SERVICE_STOPPED);
}
참고 : 지금 OnPreShutdown()
메소드를 구현메시지 (이미 종료 된 상태 여야 함) Windows에서 다른 서비스를 계속 종료하려면 OnPreShutdown()
메서드가 끝나면 SetServiceStatus(SERVICE_STOPPED)
최종 호출을 추가해야합니다.
결론은 다음과 같습니다. ATL에 [features] (https : // msdn.microsoft.com/en-us/library/windows/desktop/ms685058.aspx). Windows XP/Server 2003 이후로 많이 사용되었습니다. 조금 슬픈 일입니다. 그래도 분석과 솔루션에 대한 좋은 직장입니다. – IInspectable