Реализация объекта приемника рекомендаций
Область применения: Outlook 2013 | Outlook 2016
Клиент может реализовать собственные объекты приемника рекомендаций или использовать служебную функцию HrAllocAdviseSink. HrAllocAdviseSink создает объект приемника рекомендаций с реализацией OnNotify , которая вызывает функцию обратного вызова.
У использования HrAllocAdviseSink есть свои преимущества и недостатки. Он может сохранить работу, но не обеспечивает контроля над подсчетом ссылок на создаваемый объект приемника рекомендаций. Таким образом, клиенты, которым необходимо тщательно контролировать выпуск приемника рекомендаций или имеющие взаимозависимость между приемником рекомендаций и другим клиентским объектом, должны создать собственную реализацию IMAPIAdviseSink и полностью избегать использования HrAllocAdviseSink .
Клиент, реализующий собственный приемник рекомендаций, должен сделать его независимым объектом, не связанным с другими объектами или не зависящим от него, чтобы исключить потенциальные сложности при подсчете ссылок и освобождении объектов. Однако если необходимо реализовать приемник рекомендаций как часть другого объекта или включить в качестве элемента данных обратный указатель на другой объект, рекомендуется поддерживать два отдельных количества ссылок: один для объекта, на который ссылается приемник рекомендаций, и другой для приемника рекомендаций.
Когда число ссылок объекта, на который указывает ссылка, падает до нуля, все его методы могут завершиться сбоем и его vtable могут быть уничтожены, но память для приемника рекомендаций должна оставаться нетронутой до тех пор, пока число ссылок не упадет до нуля. Это означает, что метод Release приемника рекомендаций должен уменьшать количество ссылок и завершать уничтожение объекта, когда это число достигает нуля. Если два отдельных количества ссылок не поддерживаются, было бы легко случайно уничтожить приемник рекомендаций в рамках процесса освобождения охватывающего объекта.
Клиенты, использующие HrAllocAdviseSink для реализации приемника рекомендаций, должны быть столь же осторожными, чтобы не включать свою функцию обратного вызова в качестве метода в другой объект приемника рекомендаций. Для клиентов C++ это заманчиво и передать этот указатель в качестве параметра. Это опасная стратегия, так как клиенты обычно освобождают объект, когда его количество ссылок достигает нуля. Освобождение памяти для объекта приемника рекомендаций приведет к тому, что этот указатель будет недействительным.
В зависимости от типа события и источника рекомендаций метод OnNotify может обрабатывать события различными способами. В следующей таблице приведены рекомендации по обработке некоторых стандартных событий.
Тип события | Обработка в OnNotify |
---|---|
Объект перемещен |
Если исходный родительский элемент перемещаемого объекта связан с новым родительским элементом, обновите представление, начиная с контейнера папки или адресной книги, расположенного выше в иерархии. Если два родительских контейнера не связаны, обновите оба их представления. |
Новое сообщение |
Измените пользовательский интерфейс, чтобы сообщить пользователю о поступлении одного или нескольких новых сообщений. Поместите папку receive в текущее представление. |
Error |
Для всех объектов, кроме сеанса, при необходимости зарегистрируйте ошибку и вернитесь. Для объекта сеанса по возможности выйдите из системы. |
Поиск завершен |
Обработка не требуется. |
Примечание.
Обработчики уведомлений должны быть повторно вхожены.