Интерфейс 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 |