IMessageFilter 接口 (objidl.h)
使 COM 服务器和应用程序能够在等待来自同步调用的响应时选择性地处理传入和传出 COM 消息。 筛选消息有助于确保以提高性能并避免死锁的方式处理调用。 COM 消息可以是同步、异步或输入同步;大多数接口调用是同步的。
继承
IMessageFilter 接口继承自 IUnknown 接口。 IMessageFilter 还具有以下类型的成员:
方法
IMessageFilter 接口具有以下方法。
IMessageFilter::HandleInComingCall 为传入呼叫提供单个入口点。 |
IMessageFilter::MessagePending 指示 COM 正在等待响应远程呼叫时消息已到达。 |
IMessageFilter::RetryRejectedCall 使应用程序有机会显示提供重试、取消或任务切换选项的对话框。 |
注解
同步调用要求调用方等待答复,然后再继续。 COM 在等待答复时进入模式循环。 在此期间,调用方仍能够接收和调度传入消息。
异步调用允许调用方继续操作,而无需等待被调用对象的响应。 目前,在 COM 中,只有对对象的 IAdviseSink 接口进行异步调用。 当对象处理异步调用时,禁止它向调用对象发出任何同步调用。
若要使焦点管理和提前键入等行为正常运行,输入同步调用要求被调用对象在放弃控制之前完成调用。
使用WM_QUERYENDSESSION和WM_ENDSESSION关闭应用程序
当用户退出 Windows 时,如果退出未取消,则每个打开的应用程序都会收到 WM_QUERYENDSESSION 消息,后跟 WM_ENDSESSION 消息。 这些消息是使用 SendMessage 函数调用的,遗憾的是,这会限制所有传出 LRPC 调用的启动。 对于在收到关闭请求时打开嵌入对象的容器应用程序来说,这是一个问题,因为需要 LRPC 来关闭这些对象。包含打开文档的容器和容器/服务器应用程序通常会在收到 WM_QUERYENDSESSION 消息时显示一个消息框,询问用户是否要在退出之前保存更改。 肯定响应通常是默认的。 处理上述情况的建议是,应用程序显示一个备用消息框,询问用户是否要放弃更改;负响应应为默认值。 如果用户选择放弃更改,则应为WM_QUERYENDSESSION返回 TRUE,这向 Windows 发出可以终止的信号。 如果用户不想放弃更改,应返回 FALSE 。 不应尝试关闭或释放正在运行的嵌入。
对于WM_QUERYENDSESSION,服务器应用程序应返回 TRUE,而不提示用户。 收到 WM_ENDSESSION 消息后,所有 COM 应用程序都应为每个应用程序的文档和对象执行正常的关闭序列。 同时,应忽略任何跨进程调用或对 IUnknown::Release 的调用导致的任何错误。 必须释放 (IStorage 和 IStream 接口指针) 的所有存储指针,以正确刷新由结构化存储的复合文件实现维护的任何临时文件。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | objidl.h |