IMessageFilter::MessagePending 方法 (objidl.h)

指示 COM 正在等待响应远程呼叫时消息已到达。

在等待传出调用完成时处理输入可能会带来复杂情况。 应用程序应确定是在不中断调用的情况下处理消息、继续等待还是取消操作。

语法

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

参数

[in] htaskCallee

被调用应用程序的线程 ID。

[in] dwTickCount

自调用以来的时钟周期数。 它是从 GetTickCount 函数计算的。

[in] dwPendingType

接收消息或事件的调用类型。 可能的值来自枚举 PENDINGTYPE,其中PENDINGTYPE_TOPLEVEL表示传出调用未嵌套在另一个应用程序的调用中,PENDINTGYPE_NESTED表示传出调用嵌套在另一个应用程序的调用中。

返回值

此方法可以返回以下值。

返回代码 说明
PENDINGMSG_CANCELCALL
取消传出呼叫。 这应该仅在极端条件下返回。 取消尚未回复或被拒绝的呼叫可能会创建孤立事务并丢失资源。 COM 无法执行原始调用,并返回RPC_E_CALL_CANCELLED。
PENDINGMSG_WAITNOPROCESS
未使用。
PENDINGMSG_WAITDEFPROCESS
不再调度键盘和鼠标消息。 但是,在某些情况下,鼠标和键盘消息可能会导致系统死锁,在这些情况下,鼠标和键盘消息会被丢弃。 调度WM_PAINT消息。 任务切换和激活消息的处理方式与以前一样。

注解

COM 在应用程序进行 COM 方法调用后调用 MessagePending ,并在调用返回之前发生 Windows 消息。 例如,当用户选择菜单命令或双击对象时,将发送 Windows 消息。 在 COM 进行 MessagePending 调用之前,它会计算自进行原始 COM 方法调用以来的运行时间。 COM 在 dwTickCount 参数中提供已用时间。 同时,COM 不会从队列中删除消息。

出现在调用方队列中的 Windows 消息应保留在队列中,直到经过足够的时间,以确保消息可能不是提前键入的结果,而是试图引起注意。 使用 dwTickCount 参数设置延迟 - 建议使用 2 秒或 3 秒的延迟。 如果经过该时间并且调用尚未完成,则调用方应刷新队列中的消息,并显示“OLE UI 忙碌”对话框,为用户提供重试调用 (继续等待) 或切换到指定任务的选项。 这可确保以下行为:

  • 如果调用在合理的时间内完成,将正确处理提前键入。
  • 如果被调用方不响应,则不会误解前面键入,并且用户能够采取行动来解决问题。 例如,当请求位于模式对话框中时,OLE 1 服务器可以将请求排入队列,而不会做出响应。
在等待传出调用完成时处理输入可能会带来复杂情况。 应用程序应确定是在不中断调用的情况下处理消息、继续等待还是取消操作。

当原始 COM 调用没有响应时,应用程序可以取消调用,并通过在其存储上调用 IStorage::Revert 将 COM 对象还原到一致状态。 当容器可以关闭时,可以释放 对象。 但是,取消调用可能会造成孤立的操作和资源泄漏。 应仅将取消用作最后手段。 强烈建议应用程序不允许取消此类调用。

注意 尽管 htaskCallee 参数类型化为 HTASK,但它包含被调用线程的线程 ID。 实现 IMessageFilter 接口时,可以调用 OpenThread 函数从 htaskCallee 参数获取线程句柄,并且可以调用 GetProcessIdOfThread 函数以获取进程 ID。
 

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 objidl.h

另请参阅

IMessageFilter

OleUIBusy