Gestire l'arresto di Windows con Exes Out of Process ActiveX
-
12-11-2019 - |
Domanda
Abbiamo un'applicazione che utilizza diversi oggetti COM per vari compiti. Se l'utente dice a Windows di spegnere mentre la nostra applicazione è in esecuzione, invia tutte le applicazioni (Windows di livello superiore) una notifica di spegnimento, ma gli oggetti OOP COM possono spegnere prima che il genitore venga avvisato e ha la possibilità di spegnere in modo pulito, causando vari errori in diversi componenti.
Ciò è peggiorato poiché uno degli oggetti OOP è stato creato per ospitare un oggetto instabile di terze parti, quindi viene automaticamente riavviato quando si arresta in modo anomalo che ora non riesce a riavviare mentre Windows si sta spegnendo.
Mentre possiamo gestire gli errori sui processi dei genitori, c'è un modo per gli host ActiveX di dire a Windows "Non sto ancora chiudendo, ma lo farò a tempo debito", o anche meglio, non avvisarli a Windows il primo posto?
Sia i processi genili, gli oggetti OOP e i loro ospiti sono in una miscela di C ++ e VB6.
Soluzione
Diversi modi per farlo. Il tuo server OOP potrebbe semplicemente ignorare la richiesta di spegnimento, basandosi sul chiusura del client e rimuovere tutti i conteggi di riferimento. Probabilmente vuoi impostare un flag in modo da sapere immediatamente quando l'ultimo oggetto viene rilasciato, un server normalmente continua a funzionare per un po '.
Oppure potresti chiamare SetProcessShutDownParameters () nel server OOP. Passa un livello che hai ottenuto da GetProcessShutdownParameters () meno 1 in modo che il client riceva sempre la notifica di spegnimento prima del server. Funziona anche con server OOP che non hanno una finestra Toplevel nascosta per ottenere il messaggio Windows.