Интерфейс 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 . Не следует пытаться закрыть или освободить запущенные внедрения.

Серверные приложения должны возвращать значение TRUE для WM_QUERYENDSESSION без запроса пользователя. При получении сообщения WM_ENDSESSION все COM-приложения должны выполнять обычную последовательность закрытия для документов и объектов каждого приложения. В то же время следует игнорировать ошибки, возникающие в результате межпроцессных вызовов или вызовов IUnknown::Release. Все указатели хранилища (указатели интерфейса IStorage и IStream ) должны быть освобождены для правильной очистки всех временных файлов, поддерживаемых реализацией составных файлов структурированного хранилища.

Требования

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