IABLogon::OpenTemplateID
适用于:Outlook 2013 | Outlook 2016
打开一个收件人条目,其中包含驻留在主机通讯簿提供程序中的数据。
HRESULT OpenTemplateID(
ULONG cbTemplateID,
LPENTRYID lpTemplateID,
ULONG ulTemplateFlags,
LPMAPIPROP lpMAPIPropData,
LPCIID lpInterface,
LPMAPIPROP FAR * lppMAPIPropNew,
LPMAPIPROP lpMAPIPropSibling
);
参数
cbTemplateID
[in] lpTemplateID 参数指向的模板标识符中的字节计数。
lpTemplateID
[in]指向要打开的收件人项的模板标识符或 PR_TEMPLATEID (PidTagTemplateid) 属性的指针。
ulTemplateFlags
[in]标志的位掩码,用于指示如何打开由模板标识符表示的条目。 可以设置以下标志:
FILL_ENTRY
主机提供程序基于模板标识符表示的条目在其容器中创建一个新条目。 IABLogon::OpenTemplateID 方法应使用 lpMAPIPropData 参数中的 IMAPIProp : IUnknown 实现来执行主机提供程序条目的特定初始化,或者在 lppMAPIPropNew 参数中返回自定义 IMAPIProp 接口实现。
lpMAPIPropData
[in]指向主机提供程序的属性对象和从 IMAPIProp 派生的接口实现的指针。
lpInterface
[in]指向接口标识符的指针 (IID) ,表示将在 lppMAPIPropNew 参数中返回的接口指针的类型。 传递 null 将返回标准消息传递用户界面 IMailUser :IMAPIProp。
lppMAPIPropNew
[out]指向绑定属性对象的指针,以及从 IMAPIProp 派生的接口的实现。
lpMAPIPropSibling
[out]保留;必须为 null。
返回值
S_OK
相应的代码已成功绑定到主机提供程序中的相关数据。
MAPI_E_NO_SUPPORT
对象不支持模板 ID。
MAPI_E_UNKNOWN_ENTRYID
通讯簿提供程序无法识别 在 lpTemplateID 参数中传递的模板标识符。
备注
IABLogon::OpenTemplateID 方法仅由通讯簿提供程序实现,这些地址簿提供程序需要保持对位于主机提供程序容器中的条目副本的控制。 实现 OpenTemplateID 的提供程序称为外部通讯簿提供程序。 主机提供程序调用 IMAPISupport::OpenTemplateID 以创建复制的条目或打开复制的条目,MAPI 将调用 IABLogon::OpenTemplateID 传递。 IABLogon::OpenTemplateID 打开条目,并将控制该条目的代码绑定到主机提供程序中的数据。
IABLogon::OpenTemplateID 使用另一个属性(条目的模板标识符PR_TEMPLATEID),而不是使用条目标识符。 对于代码必须绑定到主机提供程序中的数据的条目,应支持模板标识符。
通讯簿提供程序何时应实现 IABLogon::OpenTemplateID 的一些示例如下所示:
定期更新复制条目的数据,使其与原始项保持同步。
实现主机提供程序无法实现的功能,例如从服务器上的数据动态填充条目详细信息表中显示的列表。
若要控制主机提供程序的条目和原始条目中的属性之间的交互,例如根据包含地址不同组件的详细信息显示中编辑控件的值计算 PR_EMAIL_ADDRESS (PidTagEmailAddress) 。
针对实现者的说明
当主机提供程序从提供程序复制或创建条目并通过 IABLogon::OpenTemplateID 提供属性对象实现时,可以处理大部分调用来维护该条目。 但是,由于由主机提供程序将这些呼叫转发给你,因此主机提供程序可以在转发呼叫之前截获任何呼叫并执行自定义处理。
应在属性对象实现中使用以下准则:
调用 IMAPIProp::GetProps 时,确定请求是否针对计算属性,如果是,则对其进行处理。 将非计算属性的所有请求传输到主机提供程序。
调用 IMAPIProp::OpenProperty 以打开除详细信息显示表以外的任何表时,处理请求。 无法将大多数表准确复制到主机提供程序。 必须为这些请求的表生成 IMAPITable 实现。 必须将 pidTagDetailsTable) 属性 (PR_DETAILS_TABLE详细信息表复制到主机提供程序。 这允许此提供程序在本地生成表。 可能需要包装显示表实现以生成显示表通知。
调用 IMAPIProp::SetProps 时,主机提供程序可以在设置属性之前验证数据。 可以验证是否已设置或计算所有必要的属性。 如果检测到错误,请通过 IMAPIProp::GetLastError 返回适当的错误值,并返回任何其他解释(如果可以)。
调用 IMAPIProp::SaveChanges 时,主机提供程序可能需要在保存条目之前执行处理。 应将受更改属性影响的任何数据(例如新地址)保存在主机提供程序的条目中。
一般情况下,使传递回主机提供程序的条目的实现将截获所有方法,以对相关属性执行特定于上下文的操作。 如果在 ulTemplateFlags 参数中传递了FILL_ENTRY标志,请设置条目的所有属性。
如果在 lppMAPIPropNew 参数中返回新的属性对象,请调用主机提供程序的属性对象的 IUnknown::AddRef 方法来维护引用。 通过 lppMAPIPropNew 中返回的 IMAPIProp 实现所返回的绑定对象的所有调用都应在绑定对象处理后路由到主机属性对象中的相应方法。
通过绑定属性对象传递的任何命名属性的属性标识符都位于提供程序的标识符命名空间中。 IMAPIProp::GetNamesFromIDs 方法的实现应确定属性的名称,以便它可以执行任何特定于模板的任务。 同样,提供程序传递给主机提供程序的属性也必须位于命名空间中。 例如,如果在 OpenTemplateID 中设置了命名属性,则应使用该名称的标识符之一-如有必要,请通过调用 IMAPIProp::GetIDsFromNames 方法创建它。
如果无法识别 lpTemplateID 中传递的条目标识符,则返回MAPI_E_UNKNOWN_ENTRYID。
有关如何使用通讯簿模板标识符的详细信息,请参阅 充当外部通讯簿提供程序。