Реализация объекта состояния
Область применения: Outlook 2013 | Outlook 2016
Все поставщики услуг должны реализовать объект состояния и предоставить его свойства в таблицу состояния сеанса. В таблицу состояния можно включить одну или несколько строк в зависимости от количества ресурсов, которыми вы управляете. Например, поставщик транспорта должен создать строку в таблице состояния для каждой очереди сообщений, которыми он управляет. При внесении изменений необходимо обновить соответствующую строку таблицы состояния. Объекты состояния реализуются для предоставления доступа как к сведениям, включенным в таблицу состояния, так и к дополнительным сведениям, не включенным в таблицу.
Реализация объекта состояния
Реализуйте метод OpenStatusEntry объекта входа. Когда клиенты хотят открыть объект состояния, они вызывают IMAPISession::OpenEntry. MAPI выполняет открытый запрос, вызывая метод OpenStatusEntry поставщика, в результате чего поставщик открывает свой объект состояния и возвращает клиенту указатель на его реализацию IMAPIStatus . В реализации OpenStatusEntry выполните следующие действия.
Если объект входа еще не создал объект состояния, выполните следующие задачи:
Вызовите метод IMAPISupport::OpenProfileSection объекта поддержки, чтобы получить доступ к разделу профиля поставщика.
Создайте новый объект состояния.
Сохраните ссылку на раздел профиля в объекте состояния поставщика и вызовите метод IUnknown::AddRef раздела профиля, чтобы увеличить его количество ссылок.
Сохраните ссылку на объект входа в объект состояния поставщика и вызовите метод IUnknown::AddRef объекта входа, чтобы увеличить его количество ссылок.
Сохраните ссылку на объект состояния в объекте входа поставщика.
Вызовите метод IUnknown::AddRef объекта состояния, чтобы увеличить его количество ссылок в объекте входа.
Задайте для свойства PR_OBJECT_TYPE объекта состояния (PidTagObjectType) значение MAPI_STATUS.
Задайте выходной параметр lppMAPIStatus , чтобы он указывал на объект состояния и возвращал.
Проверьте входной параметр ulFlags . Если для него задано значение MAPI_MODIFY и поставщик поддерживает доступ на чтение и запись к объекту состояния, верните объект, доступный для записи. Однако если поставщик не поддерживает доступ на чтение и запись к объекту состояния, не сбой. Возвращает объект состояния, доступный только для чтения. Клиенты, которые ожидают получать объекты состояния чтения и записи, должны убедиться, что разрешение на чтение и запись предоставлено, прежде чем пытаться внести какие-либо изменения.
Задайте все необходимые свойства объекта состояния и таблицы состояний. Свойства, которые вы включаете в строку таблицы состояния, должны быть доступны через объект состояния, за исключением свойств, вычисляемых с помощью MAPI. Ниже перечислены обязательные свойства.
PR_DISPLAY_NAME (PidTagDisplayName)
PR_PROVIDER_DLL_NAME (PidTagProviderDllName)
PR_PROVIDER_DISPLAY (PidTagProviderDisplay)
PR_RESOURCE_TYPE (PidTagResourceType)
PR_RESOURCE_METHODS (PidTagResourceMethods)
PR_RESOURCE_FLAGS (PidTagResourceFlags)
PR_STATUS_CODE (PidTagStatusCode)
Реализуйте методы IMAPIStatus: IMAPIProp , подходящие для вашего поставщика. В зависимости от поставщика вам не нужно реализовывать все четыре метода в IMAPIStatus. Каждый поставщик должен реализовать доступную только для чтения версию методов интерфейса IMAPIProp : IUnknown и метода IMAPIStatus::ValidateState .
Поставщики транспорта также должны реализовать IMAPIStatus::FlushQueues, а все поставщики должны поддерживать IMAPIStatus::SettingsDialog. Однако поддержка IMAPIStatus::ChangePassword необязательна. Реализовать этот метод необходимо только поставщикам служб, которым требуются пароли и которые хотят разрешить пользователям изменять их программным способом. Для каждого поддерживаемого метода задайте соответствующий бит в свойстве PR_RESOURCE_METHODS . Например, если вы поддерживаете только ValidateState и SettingsDialog , задайте для PR_RESOURCE_METHODS следующее:
STATUS_VALIDATE_STATE | STATUS_SETTINGS_DIALOG
Клиенты должны проверка значение PR_RESOURCE_METHODS, прежде чем пытаться вызвать объект состояния. Обработайте вызовы любого из неподдерживаемых методов, возвращая MAPI_E_NO_SUPPORT.
Вызовите IMAPISupport::ModifyStatusRow во время входа, чтобы добавить строку или строки в таблицу состояния. Передайте массив значений свойства, содержащий сведения о столбце для строки и 0 для параметра ulFlags . Если в какой-то момент позже в сеансе состояние поставщика изменится и потребуется обновить сведения о столбце, вызовите ModifyStatusRow еще раз с установленным флагом STATUSROW_UPDATE.
Дополнительные сведения об объектах состояния см. в разделе Объекты состояния MAPI.