Поделиться через


Вход в систему поставщика упакованного 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; 
}

См. также