IABContainer::ResolveNames
适用于:Outlook 2013 | Outlook 2016
对一个或多个收件人条目执行名称解析。
HRESULT ResolveNames(
LPSPropTagArray lpPropTagArray,
ULONG ulFlags,
LPADRLIST lpAdrList,
LPFlagList lpFlagList
);
参数
lpPropTagArray
[in]指向 SPropTagArray 结构的指针,该结构包含属性标记数组,这些标记描述要包含在提供程序返回的 ADRLIST 结构中的属性。 若要请求提供程序的默认属性集,请在 lpPropTagArray 参数中传递 NULL。
ulFlags
[in]控制返回字符串中文本类型的标志的位掩码。 可以设置以下标志:
EMS_AB_ADDRESS_LOOKUP
只会找到确切的代理地址匹配项;忽略部分匹配项。 仅 Exchange 通讯簿提供程序支持此标志。
MAPI_CACHE_ONLY
只有脱机通讯簿将用于执行名称解析。 例如,可以使用此标志使客户端应用程序能够在缓存交换模式下打开全局地址列表 (GAL) ,并从缓存访问该通讯簿中的条目,而无需在客户端和服务器之间创建流量。 仅 Exchange 通讯簿提供程序支持此标志。
MAPI_UNICODE
返回的字符串属性采用 Unicode 格式。 如果未设置MAPI_UNICODE标志,则字符串采用 ANSI 格式。
lpAdrList
[in,out]输入时,是指向 ADRLIST 结构的指针,该结构包含要解析的收件人列表。 输出时,指向包含已解析名称的 ADRLIST 结构的指针。
lpFlagList
[in,out]指向标志数组的指针,每个标志对应于 lpAdrList 参数中的 ADRENTRY 结构,为收件人提供名称解析操作的状态。 lpFlagList 参数中的标志与 lpAdrList 中的条目的顺序相同。 可以设置以下标志:
MAPI_AMBIGUOUS
相应的收件人已解析,但未解析为唯一条目标识符。 其他容器不应尝试解析此收件人。
MAPI_RESOLVED
相应的收件人已解析为唯一条目标识符。 其他容器不应尝试解析此收件人。
MAPI_UNRESOLVED
相应的条目尚未解析。 其他容器应尝试解析此收件人。
返回值
S_OK
名称解析过程成功。
MAPI_E_BAD_CHARWIDTH
已设置MAPI_UNICODE标志且实现不支持 Unicode,或者未设置MAPI_UNICODE且实现仅支持 Unicode。
MAPI_E_NO_SUPPORT
通讯簿提供程序不支持使用此方法进行批量名称解析。
备注
ResolveNames 方法尝试将 lpAdrList 参数中的条目数组中的未解析收件人与此通讯簿容器中的收件人进行匹配。 未解析的收件人通常只有 pidTagDisplayName) 属性的PR_DISPLAY_NAME (,可能有几个其他属性。 未解析的收件人没有 PR_ENTRYID (PidTagEntryId) 属性,并且 其 lpFlagList 参数中的相应标志设置为MAPI_UNRESOLVED。 相反,解析的收件人始终至少具有 PR_ENTRYID 属性以及其他几个属性,例如 PR_EMAIL_ADDRESS (PidTagEmailAddress) 、 PR_DISPLAY_NAME 和 PR_ADDRTYPE (PidTagAddressType) 。
名称解析通常在客户端调用 IAddrBook::ResolveName 方法时启动。 Outlook MAPI 通过调用通讯簿搜索路径中包含的每个通讯簿容器的 ResolveNames 方法(由 pidTagAbSearchPath) 属性指定的 PR_AB_SEARCH_PATH () 进行响应。 lpAdrList 参数中的条目包括已解析的收件人,因为它们位于 MAPI 已为其调用 ResolveNames 的容器中,因为这些条目出现在搜索路径的前面。
每个容器尝试通过将收件人的显示名称与其其中一个条目的显示名称相匹配来解析未解析的条目。 找到唯一匹配项后, ResolveNames 会将 PR_ENTRYID 属性和 lpPropTagArray 参数中包含的其他属性添加到传出 ADRLIST 结构中的相应条目。 然后,ResolveNames 将 lpFlagList 参数中的条目设置为MAPI_RESOLVED。 存储在 PR_ENTRYID 属性中的条目标识符可以是短期的或长期的。
在搜索路径中的所有容器都尝试了名称解析过程后,MAPI 会打开一个对话框(如果可能),提示用户帮助解决任何剩余的冲突。
客户端还可以在调用 IMessage::ModifyRecipients 方法时使用返回的 ADRLIST 结构。
针对实现者的说明
不需要使用 ResolveNames 方法支持名称解析。 相反,或者还可以使用 PR_ANR (PidTagAnr) 属性限制来支持它。 如果决定依赖 PR_ANR 限制进行名称解析,可以返回MAPI_E_NO_SUPPORT。 有关详细信息,请参阅 实现名称解析。
在 lpFlagList 参数中将收件人的标志条目设置为MAPI_UNRESOLVED(如果收件人与容器的任何收件人不匹配)。
当收件人与多个收件人匹配时,将其标志设置为MAPI_AMBIGUOUS且不更改其 ADRENTRY 结构。
MAPI 需要邮件收件人列表中包含的某些收件人属性。 可以将它们作为名称解析过程的一部分包含在 ADRENTRY 结构中,也可以等待 MAPI 通过调用 IAddrBook::P repareRecips 和 IMAPISupport::ExpandRecips 方法请求它们。 可以通过在所有已解析收件人的 ADRENTRY 结构中包含以下属性来消除这些额外的调用并提高性能:
PR_ADDRTYPE
PR_DISPLAY_NAME
PR_EMAIL_ADDRESS
PR_ENTRYID
PR_OBJECT_TYPE (PidTagObjectType)
PR_SEARCH_KEY (PidTagSearchKey)
PR_TRANSMITABLE_DISPLAY_NAME (PidTagTransmittableDisplayName)
如果 lpPropTagArray 参数中的某些属性不可用(通常是因为容器条目不支持属性,并且它们未包含在 ADRLIST 结构中的收件人 ADRENTRY 成员中),请将每个不可用属性的属性类型设置为PT_ERROR。
不要从已解析收件人的 ADRENTRY 结构中删除任何属性。
如果必须替换而不是修改 ADRENTRY 结构,请先通过调用 MAPIFreeBuffer 函数释放原始 ADRENTRY 结构,然后使用 MAPIAllocateBuffer 分配替换 ADRENTRY 结构。