Compartir a través de


Interfaz IMessageFilter (objidl.h)

Proporciona servidores COM y aplicaciones con la capacidad de controlar selectivamente los mensajes COM entrantes y salientes mientras esperan respuestas de llamadas sincrónicas. El filtrado de mensajes ayuda a garantizar que las llamadas se controlan de forma que mejore el rendimiento y evite interbloqueos. Los mensajes COM pueden ser sincrónicos, asincrónicos o sincronizados de entrada; la mayoría de las llamadas de interfaz son sincrónicas.

Herencia

La interfaz IMessageFilter hereda de la interfaz IUnknown . IMessageFilter también tiene estos tipos de miembros:

Métodos

La interfaz IMessageFilter tiene estos métodos.

 
IMessageFilter::HandleInComingCall

Proporciona un único punto de entrada para las llamadas entrantes.
IMessageFilter::MessagePending

Indica que ha llegado un mensaje mientras COM está esperando responder a una llamada remota.
IMessageFilter::RetryRejectedCall

Proporciona a las aplicaciones la oportunidad de mostrar un cuadro de diálogo que ofrece opciones de reintento, cancelación o conmutación de tareas.

Comentarios

Las llamadas sincrónicas requieren que el autor de la llamada espere una respuesta antes de continuar. COM entra en un bucle modal mientras espera la respuesta. Durante este tiempo, el autor de la llamada todavía puede recibir y enviar mensajes entrantes.

Las llamadas asincrónicas permiten que el autor de la llamada continúe sin esperar una respuesta del objeto llamado. En la actualidad, en COM, las únicas llamadas asincrónicas son a la interfaz IAdviseSink de un objeto. Aunque el objeto está procesando una llamada asincrónica, se prohíbe realizar llamadas sincrónicas al objeto que realiza la llamada.

Para habilitar comportamientos como la administración del foco y la escritura anticipada para funcionar correctamente, las llamadas sincronizadas con entrada requieren que el objeto llamado complete la llamada antes de renunciar al control.

Apagado de la aplicación con WM_QUERYENDSESSION y WM_ENDSESSION

Cuando un usuario sale de Windows, cada aplicación abierta recibe un mensaje de WM_QUERYENDSESSION seguido de un mensaje de WM_ENDSESSION , siempre que no se cancele la salida. Estos mensajes se invocan con la función SendMessage , que desafortunadamente restringe el inicio de todas las llamadas LRPC salientes. Este es un problema para las aplicaciones contenedoras que tienen objetos incrustados abiertos cuando reciben la solicitud de apagado porque LRPC es necesario para cerrar esos objetos.

Las aplicaciones contenedora y contenedor/servidor con documentos abiertos suelen mostrar un cuadro de mensaje al recibir el mensaje de WM_QUERYENDSESSION que pregunta si el usuario quiere guardar los cambios antes de salir. Normalmente, una respuesta positiva es el valor predeterminado. La recomendación para tratar la situación descrita anteriormente es para que la aplicación muestre un cuadro de mensaje alternativo que pregunta si el usuario quiere descartar los cambios; una respuesta negativa debe ser el valor predeterminado. Si el usuario decide descartar los cambios, se debe devolver TRUE para WM_QUERYENDSESSION, lo que indica a Windows que puede finalizar. Si el usuario no desea descartar los cambios, se debe devolver FALSE . No se debe realizar ningún intento de cerrar o liberar insértese en ejecución de incrustaciones.

Las aplicaciones de servidor deben devolver TRUE para WM_QUERYENDSESSION sin preguntar al usuario. Al recibir un mensaje de WM_ENDSESSION , todas las aplicaciones COM deben ejecutar la secuencia de cierre normal para los documentos y objetos de cada aplicación. Al mismo tiempo, debe omitir los errores resultantes de cualquier llamada entre procesos o llamadas a IUnknown::Release. Todos los punteros de almacenamiento (punteros de interfaz IStorage e IStream ) deben liberarse para vaciar correctamente los archivos temporales mantenidos por la implementación de archivos compuestos del almacenamiento estructurado.

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