Вход в систему поставщика упакованного PST-хранилища
Область применения: Outlook 2013 | Outlook 2016
Прежде чем вы сможете войти в MAPI к поставщику хранилища PST с оболочкой, необходимо инициализировать и настроить поставщик хранилища файлов личных папок (PST). Дополнительные сведения см. в разделе Инициализация поставщика упакованого PST-хранилища.
После инициализации и настройки поставщика хранилища PST в оболочке необходимо реализовать две подпрограммы входа. Функция IMSProvider::Logon регистрирует в MAPI поставщика хранилища PST в оболочке. Функция IMSProvider::SpoolerLogon регистрирует в диспетчере очереди MAPI поставщику упакованной PST-хранилища.
В этом разделе функция IMSProvider::Logon и функция IMSProvider::SpoolerLogon демонстрируются с помощью примеров кода из примера поставщика хранилища PST в оболочке. В этом примере реализуется поставщик PST в оболочке, который предназначен для использования в сочетании с API репликации. Дополнительные сведения о скачивании и установке поставщика хранилища PST в оболочке см. в разделе Установка поставщика хранилища PST в оболочке. Дополнительные сведения об API репликации см. в разделе Сведения об API репликации.
После входа MAPI и диспетчера очереди MAPI в поставщик хранилища PST-файлов, он готов к использованию. Дополнительные сведения см. в статье Использование поставщика упакованого PST-хранилища.
Процедура входа MAPI
После инициализации поставщика хранилища PST в оболочке необходимо реализовать функцию IMSProvider::Logon , чтобы войти в MAPI в упаковаемое хранилище PST. Эта функция проверяет учетные данные пользователя и получает свойства конфигурации для поставщика. Кроме того, необходимо реализовать функцию SetOLFIInOST
, чтобы задать сведения о автономном файле (OLFI ).
OLFI — это очередь структур долгосрочных идентификаторов, которая используется поставщиком хранилища PST с оболочкой для назначения идентификатора записи для нового сообщения или папки в автономном режиме. Наконец, функция IMSProvider::Logon возвращает объект хранилища сообщений, в который в параметре могут войти средство spooler MAPI и клиентские ppMDB
приложения.
Пример CMSProvider::Logon()
STDMETHODIMP CMSProvider::Logon(
LPMAPISUP pSupObj,
ULONG ulUIParam,
LPTSTR pszProfileName,
ULONG cbEntryID,
LPENTRYID pEntryID,
ULONG ulFlags,
LPCIID pInterface,
ULONG * pcbSpoolSecurity,
LPBYTE * ppbSpoolSecurity,
LPMAPIERROR * ppMAPIError,
LPMSLOGON * ppMSLogon,
LPMDB * ppMDB)
{
HRESULT hRes = S_OK;
LPMDB lpPSTMDB = NULL;
CMsgStore* pWrappedMDB = NULL;
Log(true,"CMSProvider::Logon Pst logon Called\n");
LPPROFSECT lpProfSect = NULL;
CSupport * pMySup = NULL;
hRes = GetGlobalProfileObject(pSupObj,&lpProfSect);
pMySup = new CSupport(pSupObj, lpProfSect);
if (!pMySup)
{
Log(true,"CMSProvider::Logon: Failed to allocate new CSupport object\n");
hRes = E_OUTOFMEMORY;
}
if (SUCCEEDED(hRes))
{
ulFlags = (ulFlags & ~MDB_OST_LOGON_ANSI) | MDB_OST_LOGON_UNICODE;
hRes = m_pPSTMS->Logon(
pMySup,
ulUIParam,
pszProfileName,
cbEntryID,
pEntryID,
ulFlags,
pInterface,
pcbSpoolSecurity,
ppbSpoolSecurity,
ppMAPIError,
ppMSLogon,
&lpPSTMDB);
}
Log(true,"CMSProvider::Logon returned 0x%08X\n", hRes);
// Set up the MDB to allow synchronization
if (SUCCEEDED(hRes))
{
hRes = SetOLFIInOST(lpPSTMDB);
Log(true,"SetOLFIInOST returned 0x%08X\n", hRes);
}
// Wrap the outgoing MDB
pWrappedMDB = new CMsgStore (lpPSTMDB);
if (NULL == pWrappedMDB)
{
Log(true,"CMSProvider::Logon: Failed to allocate new CMsgStore object\n");
hRes = E_OUTOFMEMORY;
}
// Copy pointer to the allocated object back into the return LPMDB object pointer
*ppMDB = pWrappedMDB;
if (lpProfSect) lpProfSect->Release();
return hRes;
}
Процедура входа в систему с диспетчером очереди MAPI
Как и в случае с IMSProvider::Logon, необходимо реализовать функцию IMSProvider::SpoolerLogon , чтобы заносить средство spooler MAPI в упакованное хранилище PST- файлов. Объект хранилища сообщений, в который может войти диспетчер очереди MAPI и клиентские приложения, возвращается в параметре ppMDB
.
Пример CMSProvider::SpoolerLogon()
STDMETHODIMP CMSProvider::SpoolerLogon (
LPMAPISUP pSupObj,
ULONG ulUIParam,
LPTSTR pszProfileName,
ULONG cbEntryID,
LPENTRYID pEntryID,
ULONG ulFlags,
LPCIID pInterface,
ULONG cbSpoolSecurity,
LPBYTE pbSpoolSecurity,
LPMAPIERROR * ppMAPIError,
LPMSLOGON * ppMSLogon,
LPMDB * ppMDB)
{
HRESULT hRes = S_OK;
Log(true,"CMSProvider::SpoolerLogon\n");
LPPROFSECT lpProfSect = NULL;
CSupport * pMySup = NULL;
hRes = GetGlobalProfileObject(pSupObj,&lpProfSect);
pMySup = new CSupport(pSupObj, lpProfSect);
if (!pMySup)
{
Log(true,"CMSProvider::SpoolerLogon: " +
"Failed to allocate new CSupport object\n");
hRes = E_OUTOFMEMORY;
}
if (SUCCEEDED(hRes))
{
hRes = m_pPSTMS->SpoolerLogon(
pMySup,//pSupObj,
ulUIParam,
pszProfileName,
cbEntryID,
pEntryID,
ulFlags,
pInterface,
cbSpoolSecurity,
pbSpoolSecurity,
ppMAPIError,
ppMSLogon,
ppMDB);
}
Log(true,"CMSProvider::SpoolerLogon returned 0x%08X\n", hRes);
return hRes;
}