Método IMessageFilter::MessagePending (objidl.h)
Indica que ha llegado un mensaje mientras COM está esperando responder a una llamada remota.
Controlar la entrada mientras espera a que finalice una llamada saliente puede presentar complicaciones. La aplicación debe determinar si se debe procesar el mensaje sin interrumpir la llamada, continuar esperando o cancelar la operación.
Sintaxis
DWORD MessagePending(
[in] HTASK htaskCallee,
[in] DWORD dwTickCount,
[in] DWORD dwPendingType
);
Parámetros
[in] htaskCallee
Identificador de subproceso de la aplicación llamada.
[in] dwTickCount
Número de tics desde que se realizó la llamada. Se calcula a partir de la función GetTickCount .
[in] dwPendingType
Tipo de llamada realizada durante el cual se recibió un mensaje o evento. Los valores posibles proceden de la enumeración PENDINGTYPE, donde PENDINGTYPE_TOPLEVEL significa que la llamada saliente no estaba anidada dentro de una llamada desde otra aplicación y PENDINTGYPE_NESTED significa que la llamada saliente se anidada dentro de una llamada desde otra aplicación.
Valor devuelto
Este método puede devolver los valores siguientes.
Código devuelto | Descripción |
---|---|
|
Cancele la llamada saliente. Esto solo debe devolverse en condiciones extremas. La cancelación de una llamada que no ha respondido o rechazado puede crear transacciones huérfanas y perder recursos. COM produce un error en la llamada original y devuelve RPC_E_CALL_CANCELLED. |
|
Sin usar. |
|
Los mensajes de teclado y mouse ya no se envían. Sin embargo, hay algunos casos en los que los mensajes del mouse y del teclado podrían hacer que el sistema interbloquee y, en estos casos, se descartan los mensajes del mouse y del teclado. WM_PAINT se envían los mensajes. Los mensajes de activación y cambio de tareas se controlan como antes. |
Comentarios
COM llama a MessagePending después de que una aplicación haya realizado una llamada de método COM y se produzca un mensaje de Windows antes de que se haya devuelto la llamada. Se envía un mensaje de Windows, por ejemplo, cuando el usuario selecciona un comando de menú o hace doble clic en un objeto. Antes de que COM realice la llamada MessagePending , calcula el tiempo transcurrido desde que se realizó la llamada al método COM original. COM entrega el tiempo transcurrido en el parámetro dwTickCount . Mientras tanto, COM no quita el mensaje de la cola.
Los mensajes de Windows que aparecen en la cola del autor de la llamada deben permanecer en la cola hasta que haya transcurrido suficiente tiempo para asegurarse de que los mensajes probablemente no sean el resultado de escribir por adelantado, sino que son en su lugar un intento de obtener atención. Establezca el retraso con el parámetro dwTickCount : se recomienda un retraso de dos o tres segundos. Si esa cantidad de tiempo pasa y no se ha completado la llamada, el autor de la llamada debe vaciar los mensajes de la cola y el cuadro de diálogo Ocupado de la interfaz de usuario OLE debe mostrarse ofreciendo al usuario la opción de reintentar la llamada (continuar esperando) o cambiar a la tarea especificada. Esto garantiza los siguientes comportamientos:
- Si las llamadas se completan en un período de tiempo razonable, el tipo por adelantado se tratará correctamente.
- Si el destinatario no responde, el tipo anticipado no se interpreta mal y el usuario puede actuar para resolver el problema. Por ejemplo, los servidores OLE 1 pueden poner en cola solicitudes sin responder cuando están en cuadros de diálogo modales.
Cuando no hay ninguna respuesta a la llamada COM original, la aplicación puede cancelar la llamada y restaurar el objeto COM a un estado coherente llamando a IStorage::Revert en su almacenamiento. El objeto se puede liberar cuando el contenedor se puede apagar. Sin embargo, la cancelación de una llamada puede crear operaciones huérfanas y fugas de recursos. La cancelación solo se debe usar como último recurso. Se recomienda encarecidamente que las aplicaciones no permitan que se cancelen dichas llamadas.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 2000 Professional [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows 2000 Server [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | objidl.h |