适用于: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 方法都使用链接的分配器 MAPIAllocateBuffer、 MAPIAllocateMore 和 MAPIFreeBuffer 来管理接口参数的内存。 OLE 定义的所有接口的 MAPI 实现(例如 IStream)都使用标准 COM 任务分配器。 |
| 当方法失败时,必须将所有输出指针参数显式设置为 NULL。 | MAPI 接口要求输出指针参数设置为 NULL,或者在方法失败时保持不变。 OLE 定义的接口的所有 MAPI 实现都会在失败时将参数显式设置为 NULL。 |
| 尽可能实现可聚合对象。 | MAPI 接口不可聚合。 |