Поделиться через


Метод IMessageFilter::MessagePending (objidl.h)

Указывает, что сообщение поступило, пока COM ожидает ответа на удаленный вызов.

Обработка входных данных во время ожидания завершения исходящего звонка может привести к осложнениям. Приложение должно определить, следует ли обработать сообщение без прерывания вызова, продолжить ожидание или отменить операцию.

Синтаксис

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

Параметры

[in] htaskCallee

Идентификатор потока вызываемого приложения.

[in] dwTickCount

Количество тактов с момента вызова. Он вычисляется на основе функции GetTickCount .

[in] dwPendingType

Тип вызова, во время которого было получено сообщение или событие. Возможные значения из перечисления PENDINGTYPE, где PENDINGTYPE_TOPLEVEL означает, что исходящий вызов не был вложен в вызов из другого приложения, а PENDINTGYPE_NESTED означает, что исходящий вызов был вложен в вызов из другого приложения.

Возвращаемое значение

Этот метод может возвращать следующие значения.

Код возврата Описание
PENDINGMSG_CANCELCALL
Отмена исходящего вызова. Это значение должно возвращаться только в экстремальных условиях. Отмена вызова, который не ответил или был отклонен, может создать потерянные транзакции и потерять ресурсы. COM завершает исходный вызов и возвращает RPC_E_CALL_CANCELLED.
PENDINGMSG_WAITNOPROCESS
Не используется.
PENDINGMSG_WAITDEFPROCESS
Сообщения клавиатуры и мыши больше не отправляются. Однако в некоторых случаях сообщения мыши и клавиатуры могут привести к взаимоблокировке системы, и в этих случаях сообщения мыши и клавиатуры удаляются. WM_PAINT сообщения отправляются. Сообщения о переключении задач и активации обрабатываются как раньше.

Комментарии

COM вызывает MessagePending после того, как приложение совершило вызов метода COM, и сообщение Windows появляется до возврата вызова. Сообщение Windows отправляется, например, когда пользователь выбирает команду меню или дважды щелкает объект. Перед выполнением вызова MessagePending COM вычисляет время, прошедшее с момента первоначального вызова метода COM. COM предоставляет затраченное время в параметре dwTickCount . В то же время COM не удаляет сообщение из очереди.

Сообщения Windows, которые отображаются в очереди вызывающего абонента, должны оставаться в очереди до тех пор, пока не пройдет достаточно времени, чтобы убедиться, что сообщения, вероятно, не являются результатом опережающего ввода, а являются попыткой получить внимание. Задайте задержку с помощью параметра dwTickCount . Рекомендуется использовать задержку в две или три секунды. Если это время прошло, а вызов не был завершен, вызывающий абонент должен очистить сообщения из очереди, и должно появиться диалоговое окно "Занят OLE UI", предлагающее пользователю выбрать повторную попытку вызова (продолжить ожидание) или переключиться на указанную задачу. Это гарантирует следующее поведение:

  • Если вызовы завершены в разумный промежуток времени, тип упреждающего ввода будет обрабатываться правильно.
  • Если вызываемый не отвечает, введите "вперед" не будет неправильно истолковано, и пользователь может принять меры для решения проблемы. Например, серверы OLE 1 могут помещать запросы в очередь, не отвечая на запросы, когда они находятся в модальных диалоговых окнах.
Обработка входных данных во время ожидания завершения исходящего звонка может привести к осложнениям. Приложение должно определить, следует ли обработать сообщение без прерывания вызова, продолжить ожидание или отменить операцию.

Если ответ на исходный com-вызов отсутствует, приложение может отменить вызов и восстановить объект COM в согласованном состоянии, вызвав метод IStorage::Revert в своем хранилище. Объект может быть освобожден, когда контейнер может завершить работу. Однако отмена вызова может вызвать потерянные операции и утечки ресурсов. Отмена должна использоваться только в крайнем случае. Настоятельно рекомендуется, чтобы приложения не разрешали отмену таких вызовов.

Примечание Хотя параметр htaskCallee типизированный как HTASK, он содержит идентификатор потока вызываемого потока. При реализации интерфейса IMessageFilter можно вызвать функцию OpenThread , чтобы получить дескриптор потока из параметра htaskCallee , и вызвать функцию GetProcessIdOfThread , чтобы получить идентификатор процесса.
 

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header objidl.h

См. также раздел

Imessagefilter

OleUIBusy