Interfaccia IMessageFilter (objidl.h)

Fornisce server e applicazioni COM con la possibilità di gestire in modo selettivo i messaggi COM in ingresso e in uscita in attesa di risposte da chiamate sincrone. Il filtro dei messaggi consente di garantire che le chiamate vengano gestite in modo da migliorare le prestazioni ed evitare deadlock. I messaggi COM possono essere sincroni, asincroni o sincronizzati con input; la maggior parte delle chiamate di interfaccia è sincrona.

Ereditarietà

L'interfaccia IMessageFilter eredita dall'interfaccia IUnknown . IMessageFilter include anche questi tipi di membri:

Metodi

L'interfaccia IMessageFilter include questi metodi.

 
IMessageFilter::HandleInComingCall

Fornisce un singolo punto di ingresso per le chiamate in ingresso.
IMessageFilter::MessagePending

Indica che un messaggio è arrivato mentre COM è in attesa di rispondere a una chiamata remota.
IMessageFilter::RetryRejectedCall

Offre alle applicazioni la possibilità di visualizzare una finestra di dialogo che offre opzioni di ripetizione, annullamento o cambio di attività.

Commenti

Le chiamate sincrone richiedono al chiamante di attendere una risposta prima di continuare. COM immette un ciclo modale durante l'attesa della risposta. Durante questo periodo, il chiamante è ancora in grado di ricevere e inviare messaggi in arrivo.

Le chiamate asincrone consentono al chiamante di procedere senza attendere una risposta dall'oggetto chiamato. Oggi, in COM, le uniche chiamate asincrone sono all'interfaccia IAdviseSink di un oggetto. Mentre l'oggetto elabora una chiamata asincrona, non è consentito eseguire chiamate sincrone all'oggetto chiamante.

Per abilitare comportamenti come la gestione dello stato attivo e il type-ahead per funzionare correttamente, le chiamate sincronizzate dall'input richiedono che l'oggetto chiamato completi la chiamata prima di rinunciare al controllo.

Arresto dell'applicazione con WM_QUERYENDSESSION e WM_ENDSESSION

Quando un utente esce da Windows, ogni applicazione aperta riceve un messaggio WM_QUERYENDSESSION seguito da un messaggio di WM_ENDSESSION , purché l'uscita non venga annullata. Questi messaggi vengono richiamati con la funzione SendMessage , che purtroppo limita l'avvio di tutte le chiamate LRPC in uscita. Si tratta di un problema per le applicazioni contenitore con oggetti incorporati aperti quando ricevono la richiesta di arresto perché LRPC è necessario per chiudere tali oggetti.

Le applicazioni contenitore e contenitore/server con documenti aperti visualizzano in genere una finestra di messaggio alla ricezione del messaggio di WM_QUERYENDSESSION che chiede se l'utente vuole salvare le modifiche prima di uscire. Una risposta positiva è in genere l'impostazione predefinita. La raccomandazione per gestire la situazione descritta in precedenza è che l'applicazione visualizzi una finestra di messaggio alternativa che chiede se l'utente vuole annullare le modifiche; una risposta negativa deve essere l'impostazione predefinita. Se l'utente sceglie di rimuovere le modifiche, true deve essere restituito per WM_QUERYENDSESSION, che segnala a Windows che può terminare. Se l'utente non vuole annullare le modifiche, deve essere restituito FALSE. Non è necessario tentare di chiudere o rilasciare incorporamenti in esecuzione.

Le applicazioni server devono restituire TRUE per WM_QUERYENDSESSION senza chiedere conferma all'utente. Al ricevimento di un messaggio di WM_ENDSESSION , tutte le applicazioni COM devono eseguire la normale sequenza di chiusura per i documenti e gli oggetti di ogni applicazione. Allo stesso tempo, è consigliabile ignorare eventuali errori risultanti da qualsiasi chiamata o chiamata tra processi a IUnknown::Release. Tutti i puntatori di archiviazione (puntatori all'interfaccia IStorage e IStream ) devono essere rilasciati per scaricare correttamente tutti i file temporanei gestiti dall'implementazione composta di file di archiviazione strutturata.

Requisiti

Requisito Valore
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione objidl.h