登录包装的 PST 存储区提供程序

适用于:Outlook 2013 | Outlook 2016

在 MAPI 登录到包装的 PST 存储提供程序之前,必须初始化并配置包装的个人文件夹文件, (PST) 存储提供程序。 有关详细信息,请参阅 初始化包装的 PST 存储提供程序

初始化并配置包装的 PST 存储提供程序后,必须实现两个登录例程。 IMSProvider::Logon 函数在 MAPI 上登录到包装的 PST 存储提供程序。 IMSProvider::SpoolerLogon 函数将 MAPI 后台处理程序上的日志记录到包装的 PST 存储提供程序。

在本主题中,使用示例包装 PST 存储提供程序中的代码示例演示 IMSProvider::Logon 函数和 IMSProvider::SpoolerLogon 函数。 此示例实现一个包装的 PST 提供程序,该提供程序旨在与复制 API 结合使用。 有关下载和安装示例包装 PST 存储提供程序的详细信息,请参阅 安装示例包装 PST 存储提供程序。 有关复制 API 的详细信息,请参阅 关于复制 API

MAPI 和 MAPI 后台处理程序登录到包装的 PST 存储提供程序后,即可使用。 有关详细信息,请参阅 使用包装的 PST 存储提供程序

MAPI 登录例程

初始化包装的 PST 存储提供程序后,必须实现 IMSProvider::Logon 函数才能将 MAPI 登录到包装的 PST 存储。 此函数验证用户凭据并获取提供程序的配置属性。 还必须实现 函数以 SetOLFIInOST 设置脱机文件信息 (OLFI ) 。 OLFI 是一个长期 ID 结构的队列,包装的 PST 存储提供程序使用它为脱机模式下的新邮件或文件夹分配条目 ID。 最后, IMSProvider::Logon 函数返回一个消息存储对象,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 函数,才能将 MAPI 后台处理程序记录到包装的 PST 存储。 参数中 ppMDB 返回 MAPI 后台处理程序和客户端应用程序可以登录的消息存储对象。

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; 
}

另请参阅