Загрузка поставщиков хранилища сообщений
Область применения: Outlook 2013 | Outlook 2016
Когда клиентское приложение открывает хранилище сообщений, MAPI загружает библиотеку DLL поставщика хранилища сообщений в память. После загрузки БИБЛИОТЕКи DLL MAPI между поставщиком хранилища сообщений и MAPI происходит определенная последовательность вызовов методов. Эта последовательность вызовов метода позволяет MAPI получить интерфейсы IMSProvider верхнего уровня : IUnknown, IMSLogon : IUnknown и IMsgStore : IMAPIProp и позволяет поставщику хранилища сообщений получить объект поддержки MAPI. После последовательности вызовов поставщик хранилища сообщений должен быть готов к приему входов от клиентов.
Последовательность вызовов при загрузке библиотеки DLL поставщика сообщений выглядит следующим образом:
Клиент вызывает IMAPISession::OpenMsgStore.
Если хранилище сообщений еще не открыто, MAPI загружает библиотеку DLL поставщика хранилища и вызывает точку входа MSProviderInit библиотеки DLL. Если хранилище сообщений уже открыто, MAPI пропускает шаги 2 и 3, а затем использует существующий интерфейс IMSProvider : IUnknown для выполнения шага 4.
MSProviderInit создает и возвращает объект IMSProvider .
MAPI вызывает IMSProvider::Logon, передавая идентификатор входа в хранилище сообщений клиентского приложения.
IMSProvider::Logon создает и возвращает интерфейс IMSLogon : IUnknown и интерфейс IMsgStore : IMAPIProp , а затем вызывает метод IUnknown::AddRef в интерфейсе IMAPISupport : IUnknown . Если идентификатор входа хранилища сообщений клиента ссылается на уже открытое хранилище сообщений, поставщик хранилища сообщений может возвращать существующие интерфейсы IMSLogon и IMsgStore и не требует вызова AddRef для своего объекта поддержки.
Если клиент не задал флаг MAPI_NO_MAIL при входе в систему и он не задал MDB_NO_MAIL на шаге 1, MAPI передает идентификатор входа хранилища сообщений в средство spooler MAPI, чтобы диспетчер очереди MAPI смог войти в хранилище сообщений.
MAPI возвращает интерфейс IMsgStore клиенту.
Диспетчер очереди MAPI вызывает IMSProvider::SpoolerLogon.
IMSProvider::SpoolerLogon возвращает те же интерфейсы IMSLogon и IMsgStore из шага 5.
Примечание.
Если вызов для входа в систему поставщика хранилища сообщений завершается ошибкой из-за неправильного пароля и поставщик хранилища сообщений не может отобразить интерфейс, чтобы запросить правильный пароль, он должен вернуть MAPI_E_FAILONEPROVIDER из метода IMSProvider::Logon . Это позволит клиентам запрашивать у пользователя пароль для повторного входа в поставщик хранилища сообщений, а не привести к сбою поставщика MAPI в течение всего сеанса.