Condividi tramite


Metodo IMessageFilter::MessagePending (objidl.h)

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

La gestione dell'input durante l'attesa del completamento di una chiamata in uscita può introdurre complicazioni. L'applicazione deve determinare se elaborare il messaggio senza interrompere la chiamata, continuare l'attesa o annullare l'operazione.

Sintassi

DWORD MessagePending(
  [in] HTASK htaskCallee,
  [in] DWORD dwTickCount,
  [in] DWORD dwPendingType
);

Parametri

[in] htaskCallee

ID thread dell'applicazione chiamata.

[in] dwTickCount

Numero di tick dal momento in cui è stata effettuata la chiamata. Viene calcolato dalla funzione GetTickCount .

[in] dwPendingType

Tipo di chiamata effettuata durante la ricezione di un messaggio o di un evento. I valori possibili provengono dall'enumerazione PENDINGTYPE, dove PENDINGTYPE_TOPLEVEL indica che la chiamata in uscita non è stata annidata all'interno di una chiamata da un'altra applicazione e PENDINTGYPE_NESTED indica che la chiamata in uscita è stata annidata all'interno di una chiamata da un'altra applicazione.

Valore restituito

Questo metodo può restituire i valori seguenti.

Codice restituito Descrizione
PENDINGMSG_CANCELCALL
Annullare la chiamata in uscita. Questo valore deve essere restituito solo in condizioni estreme. L'annullamento di una chiamata che non ha risposto o è stato rifiutato può creare transazioni orfane e perdere risorse. COM non riesce la chiamata originale e restituisce RPC_E_CALL_CANCELLED.
PENDINGMSG_WAITNOPROCESS
Non utilizzato.
PENDINGMSG_WAITDEFPROCESS
I messaggi tramite tastiera e mouse non vengono più inviati. Esistono tuttavia alcuni casi in cui i messaggi del mouse e della tastiera potrebbero causare il deadlock del sistema e, in questi casi, i messaggi del mouse e della tastiera vengono eliminati. WM_PAINT i messaggi vengono inviati. I messaggi di attivazione e cambio di attività vengono gestiti come prima.

Commenti

COM chiama MessagePending dopo che un'applicazione ha effettuato una chiamata al metodo COM e si verifica un messaggio di Windows prima che la chiamata venga restituita. Viene inviato un messaggio di Windows, ad esempio quando l'utente seleziona un comando di menu o fa doppio clic su un oggetto. Prima che COM effettui la chiamata MessagePending , calcola il tempo trascorso dall'esecuzione della chiamata al metodo COM originale. COM fornisce il tempo trascorso nel parametro dwTickCount . Nel frattempo, COM non rimuove il messaggio dalla coda.

I messaggi di Windows visualizzati nella coda del chiamante devono rimanere nella coda fino a quando non è trascorso un tempo sufficiente per garantire che i messaggi non siano probabilmente il risultato della digitazione in anticipo, ma sono invece un tentativo di ottenere attenzione. Impostare il ritardo con il parametro dwTickCount . È consigliabile un ritardo di due secondi o di tre secondi. Se la quantità di tempo passa e la chiamata non è stata completata, il chiamante deve scaricare i messaggi dalla coda e la finestra di dialogo Dell'interfaccia utente OLE occupato deve essere visualizzata offrendo all'utente la possibilità di ritentare la chiamata (continuare l'attesa) o di passare all'attività specificata. Ciò garantisce i comportamenti seguenti:

  • Se le chiamate vengono completate in un periodo di tempo ragionevole, il tipo ahead verrà trattato correttamente.
  • Se il chiamato non risponde, il tipo ahead non viene interpretato in modo non corretto e l'utente è in grado di agire per risolvere il problema. Ad esempio, i server OLE 1 possono accodamento delle richieste senza rispondere quando si trovano in finestre di dialogo modali.
La gestione dell'input durante l'attesa del completamento di una chiamata in uscita può introdurre complicazioni. L'applicazione deve determinare se elaborare il messaggio senza interrompere la chiamata, continuare l'attesa o annullare l'operazione.

Quando non è presente alcuna risposta alla chiamata COM originale, l'applicazione può annullare la chiamata e ripristinare l'oggetto COM in uno stato coerente chiamando IStorage::Revert nella relativa risorsa di archiviazione. L'oggetto può essere rilasciato quando il contenitore può essere arrestato. Tuttavia, l'annullamento di una chiamata può creare operazioni orfane e perdite di risorse. L'annullamento deve essere utilizzato solo come ultima risorsa. È consigliabile che le applicazioni non consentano l'annullamento di tali chiamate.

Nota Anche se il parametro htaskCallee viene digitato come HTASK, contiene l'ID thread del thread chiamato. Quando si implementa l'interfaccia IMessageFilter , è possibile chiamare la funzione OpenThread per ottenere l'handle del thread dal parametro htaskCallee ed è possibile chiamare la funzione GetProcessIdOfThread per ottenere l'ID del processo.
 

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

Vedi anche

IMessageFilter

OleUIBusy