MAPI 命名属性
适用于:Outlook 2013 | Outlook 2016
MAPI 提供了一个工具,用于将名称分配给属性、将这些名称映射到唯一标识符,以及使此映射持久化。 持久名称到标识符的映射可确保属性名称在会话中保持有效。
若要定义命名属性,客户端或服务提供程序将组成一个名称,并将其存储在 MAPINAMEID 结构中。 由于名称由 128 位全局唯一标识符或 GUID 组成,并且由 Unicode 字符串或 32 位数值组成,因此命名属性的创建者可以创建有意义的名称,而无需担心重复。 名称是唯一的,可以在不考虑其标识符的值的情况下使用它们。
为了支持命名属性,服务提供程序实现两种方法( IMAPIProp::GetIDSFromNames 和 IMAPIProp::GetNamesFromIDs ),以便在名称和标识符之间转换,并允许其 IMAPIProp::GetProps IMAPIProp::SetProps 方法检索和修改具有命名属性范围标识符的属性。 命名属性标识符的范围介于 0x8000 和 0xFFFE 之间。
任何实现 IMAPIProp 接口的对象都可以支持命名属性。 允许将来自其他提供程序的条目复制到其容器的通讯簿提供程序以及可用于创建任意消息类型的消息存储提供程序需要提供此支持。 它是所有其他服务提供商的一个选项。 不支持命名属性的提供程序从 GetIDsFromNames 和 GetNamesFromIDs 方法返回MAPI_E_NO_SUPPORT,并拒绝设置任何标识符为 0x8000 或更大的属性,在 SPropProblemarray 中返回MAPI_E_UNEXPECTED。
为属性创建名称是客户端为现有或自定义消息类定义新属性的一种方式。 服务提供商可以使用命名属性来公开其消息系统的独特功能。 然而,命名属性的另一个用途是提供一种替代方式来引用标识符低于0x8000的属性。
例如,客户端可以使用类似于以下代码的代码来检索对象的所有命名属性的名称:
LPSPropTagArray FAR * lppPropTags = NULL;
LPGUID lpPropSetGuid = NULL;
ULONG FAR * lpcPropNames;
LPMAPINAMEID FAR * FAR * lpppPropNames;
lpMAPIProp->GetNamesFromIDs (lppPropTags,
lpPropSetGuid,
0,
lpcPropNames,
lpppPropNames);
若要从 PS_PUBLIC_STRINGS 属性集中请求所有名称,客户端会将属性集参数中的 NULL 替换为PS_PUBLIC_STRINGS,如下所示:
LPSPropTagArray FAR * lppPropTags = NULL;
LPGUID lpPropSetGuid = &PS_PUBLIC_STRINGS;
ULONG FAR * lpcPropNames;
LPMAPINAMEID FAR * FAR * lpppPropNames;
lpMAPIProp->GetNamesFromIDs (lppPropTags,
lpPropSetGuid,
0,
lpcPropNames,
lpppPropNames);