Метод 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 означает, что исходящий вызов был вложен в вызов из другого приложения.
Возвращаемое значение
Этот метод может возвращать следующие значения.
Код возврата | Описание |
---|---|
|
Отмена исходящего вызова. Это значение должно возвращаться только в экстремальных условиях. Отмена вызова, который не ответил или был отклонен, может создать потерянные транзакции и потерять ресурсы. COM завершает исходный вызов и возвращает RPC_E_CALL_CANCELLED. |
|
Не используется. |
|
Сообщения клавиатуры и мыши больше не отправляются. Однако в некоторых случаях сообщения мыши и клавиатуры могут привести к взаимоблокировке системы, и в этих случаях сообщения мыши и клавиатуры удаляются. WM_PAINT сообщения отправляются. Сообщения о переключении задач и активации обрабатываются как раньше. |
Комментарии
COM вызывает MessagePending после того, как приложение совершило вызов метода COM, и сообщение Windows появляется до возврата вызова. Сообщение Windows отправляется, например, когда пользователь выбирает команду меню или дважды щелкает объект. Перед выполнением вызова MessagePending COM вычисляет время, прошедшее с момента первоначального вызова метода COM. COM предоставляет затраченное время в параметре dwTickCount . В то же время COM не удаляет сообщение из очереди.
Сообщения Windows, которые отображаются в очереди вызывающего абонента, должны оставаться в очереди до тех пор, пока не пройдет достаточно времени, чтобы убедиться, что сообщения, вероятно, не являются результатом опережающего ввода, а являются попыткой получить внимание. Задайте задержку с помощью параметра dwTickCount . Рекомендуется использовать задержку в две или три секунды. Если это время прошло, а вызов не был завершен, вызывающий абонент должен очистить сообщения из очереди, и должно появиться диалоговое окно "Занят OLE UI", предлагающее пользователю выбрать повторную попытку вызова (продолжить ожидание) или переключиться на указанную задачу. Это гарантирует следующее поведение:
- Если вызовы завершены в разумный промежуток времени, тип упреждающего ввода будет обрабатываться правильно.
- Если вызываемый не отвечает, введите "вперед" не будет неправильно истолковано, и пользователь может принять меры для решения проблемы. Например, серверы OLE 1 могут помещать запросы в очередь, не отвечая на запросы, когда они находятся в модальных диалоговых окнах.
Если ответ на исходный com-вызов отсутствует, приложение может отменить вызов и восстановить объект COM в согласованном состоянии, вызвав метод IStorage::Revert в своем хранилище. Объект может быть освобожден, когда контейнер может завершить работу. Однако отмена вызова может вызвать потерянные операции и утечки ресурсов. Отмена должна использоваться только в крайнем случае. Настоятельно рекомендуется, чтобы приложения не разрешали отмену таких вызовов.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 2000 Professional [только классические приложения] |
Минимальная версия сервера | Windows 2000 Server [только классические приложения] |
Целевая платформа | Windows |
Header | objidl.h |