组件对象模型和 MAPI

适用于:Outlook 2013 | Outlook 2016

Windows SDK文档全面讨论了实现符合组件对象模型 (COM) 的对象的规则。 这些规则介绍如何执行以下操作:

  • 设计接口和对象。

  • 实现 IUnknown 接口。

  • 管理内存。

  • 处理引用计数。

  • 实现单元线程对象。

尽管所有 MAPI 对象都被视为基于 COM,因为它们实现了继承自 IUnknown 的接口,但在某些情况下,MAPI 会偏离标准 COM 规则。 这种偏差使开发人员能够更灵活地实现。 例如,MAPI 接口与任何 COM 接口一样,描述实现者和调用方之间的协定。 创建并发布接口后,其定义不能也不会更改。 MAPI 不会偏离此说明,但它在一定程度上放宽了描述。 实现者可以选择不实现特定方法,将以下错误值之一返回给调用方:

  • MAPI_E_NO_SUPPORT

  • MAPI_E_TOO_COMPLEX

  • MAPI_E_BAD_CHARWIDTH

  • MAPI_E_TYPE_NO_SUPPORT

下表介绍了与标准 COM 规则的其他偏差。

COM 编程规则 MAPI 变体
接口方法中的所有字符串参数都应为 Unicode。 MAPI 接口定义为允许 Unicode 或 ANSI 字符串参数。 许多具有字符串参数的方法也具有 ulFlags 参数;字符串参数的宽度由 ulFlags 中MAPI_UNICODE标志的值指示。 设置MAPI_UNICODE标志时,某些 MAPI 接口不支持 Unicode 并返回MAPI_E_BAD_CHARWIDTH。
所有接口方法的返回类型都应为 HRESULT。 MAPI 至少有一个返回非 HRESULT 值的方法: IMAPIAdviseSink::OnNotify
调用方和实施者应使用标准 COM 任务分配器为接口参数分配和释放内存。 所有 MAPI 方法都使用链接的分配器 MAPIAllocateBufferMAPIAllocateMoreMAPIFreeBuffer 来管理接口参数的内存。 OLE 定义的所有接口的 MAPI 实现(例如 IStream)都使用标准 COM 任务分配器。
当方法失败时,必须将所有输出指针参数显式设置为 NULL。 MAPI 接口要求输出指针参数设置为 NULL,或者在方法失败时保持不变。 OLE 定义的接口的所有 MAPI 实现都会在失败时将参数显式设置为 NULL。
尽可能实现可聚合对象。 MAPI 接口不可聚合。

另请参阅

MAPIAllocateBuffer

MAPIAllocateMore

MAPIFreeBuffer

MAPI 对象和接口概述