2017-11-15 4 views
1

Ich habe Fensterdienst entwickelt. Ich möchte wissen, wie ich benachrichtigt werden kann, wenn der Dienst getötet wird. Momentan erhalte ich eine Benachrichtigung, wenn der Dienst gestoppt wird.Wie man Ereignis behandelt, wenn Fensterdienst getötet

----service startup code--- 

inline void CServiceModule::Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, UINT  nServiceNameID, const GUID* plibid) 
{ 
    CComModule::Init(p, h, plibid); 

    m_bService = TRUE; 
    m_hInstance = h; 

    if(m_szServiceName.size()==0) 
    { 
     string strServiceName = GetServiceName(); 
     m_szServiceName = strServiceName; 
    } 

    // set up the initial service status 
    m_hServiceStatus = NULL; 
    m_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 
    m_status.dwCurrentState = SERVICE_STOPPED; 
    m_status.dwControlsAccepted = SERVICE_ACCEPT_PRESHUTDOWN; 
    m_status.dwWin32ExitCode = 0; 
    m_status.dwServiceSpecificExitCode = 0; 
    m_status.dwCheckPoint = 0; 
    m_status.dwWaitHint = 0; 
} 

---Handler---- 
inline void CServiceModule::Handler(DWORD dwOpcode) 
{ 
    switch (dwOpcode) 
    { 
     case SERVICE_CONTROL_SHUTDOWN: 
     case SERVICE_CONTROL_STOP: 
      SetServiceStatus(SERVICE_STOP_PENDING); 
      PostThreadMessage(dwThreadID, WM_QUIT, 0, 0); 
      break; 
     case SERVICE_CONTROL_PAUSE: 
      break; 
     case SERVICE_CONTROL_CONTINUE: 
      break; 
     case SERVICE_CONTROL_INTERROGATE: 
      break; 
    /* case SERVICE_CONTROL_SHUTDOWN: 

     break;*/ 
     default: 
      LogEvent(_T("Bad service request")); 
    } 
} 

Ich erhalte Benachrichtigung SERVICE_CONTROL_STOP wenn der Dienst beendet wird. Bitte schlagen Sie vor, welchen Handler ich verwenden sollte, wenn Service getötet wird.

+0

Sie haben eine Anfrage zu stoppen - 'SERVICE_CONTROL_STOP' und behandeln Sie es. * wenn Service getötet wird * - was meinst du darunter? jemand beendet den Service-Prozess? in diesem Fall Service natürlich nicht notify – RbMm

Antwort

1

Wenn es getötet wird, ist es getötet. Es endet. Sofort. Du bekommst keine Signale.

jedoch neuere Versionen Fenster werden nie nur töten ein Prozess, wenn Sie, dass in dem Task-Manager auswählen. Sie senden zuerst ein nahes Signal (als ob Sie Alt-F4 gedrückt hätten) an die App, um ihr die Möglichkeit zu geben, sich elegant zu schließen. Die App wird nur beendet, wenn sie nicht in einer bestimmten Zeitspanne heruntergefahren wird.

+0

Vielen Dank. – user2354396

+0

Dienste werden in Sitzung 0 isoliert. Task-Manager und taskkill.exe können Fenster eines Desktops in einer anderen Sitzung nicht auflisten, geschweige denn eine 'WM_CLOSE'-Fensternachricht senden oder eine 'WM_QUIT'-Threadnachricht über Sitzungsgrenzen hinweg posten. Moderne Dienste erstellen im Allgemeinen keine Fenster (da sie in einer nicht interaktiven WindowStation ausgeführt werden) oder haben sogar eine angeschlossene Konsole. 'SERVICE_CONTROL_STOP' ist der einzige Weg, den ich kenne, um einen Dienst elegant zu beenden - nicht unbedingt den Prozess. – eryksun

Verwandte Themen