登录包装的 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;
}