接口设计规则

本部分简要概述了接口设计规则和准则。 其中一些规则特定于 COM 体系结构,而另一些规则是接口设计语言 MIDL 施加的限制。 有关 COM 接口设计的详细信息,请参阅 IDL 文件 剖析。

根据定义,对象不是 COM 对象,除非它实现 IUnknown 接口或从 IUnknown 派生的接口。 此外,以下规则适用于在 COM 对象上实现的所有接口:

  • 它们必须具有唯一的接口标识符(IID)。
  • 它们必须是不可变的。 创建和发布后,其定义中没有任何部分可能会更改。
  • 所有接口方法都必须返回 HRESULT 值,以便处理远程处理的系统部分可以报告 RPC 错误。
  • 接口方法中的所有字符串参数都必须为 Unicode。
  • 数据类型必须可远程处理。 如果无法将数据类型转换为可远程类型,则必须创建自己的封送和取消封送例程。 此外,LPVOID,或 void *,在远程计算机上没有意义。 如有必要,请使用指针 IUnknown

注意

MIDL 的当前实现不处理函数重载或多个继承。

 

其他接口设计注意事项

非常仔细地使用指向数据的指针。 若要在调用的进程地址空间中重新创建数据,RPC 运行时必须知道数据的确切大小。 例如,如果 CHAR * 参数指向字符缓冲区而不是单个字符,则无法正确重新创建数据。 使用 MIDL 提供的语法来准确描述类型定义表示的数据结构。

初始化对于嵌入在数组和结构中并跨进程边界传递的指针至关重要。 当传递到同一进程空间中的程序时,未初始化的指针可能有效,但代理和存根假定所有指针都是使用有效地址初始化的,或者为 null。

在对指针进行别名时要小心(允许指针指向同一内存段)。 如果别名是有意的,则应在 IDL 文件中声明这些指针的别名。 声明为非锯齿的指针不应相互别名。

请注意如何分配和释放内存。 请记住,除非显式告知 COM 对象(通过使用 分配 属性),否则不要释放在进程外调用期间创建的数据结构,该结构将在调用完成时销毁。 此外,请考虑由低效的数据结构分配造成的潜在破坏性开销,这些结构现在需要封送和取消封送。

最后,在定义 HRESULT 返回值时要小心,这样就不会创建与 COM 定义的FACILITY_ITF代码(保留0x0000和0x01FF之间的值)或与其他 HRESULT 值发生冲突的错误代码。 尽可能使用通用 COM 成功和失败返回值,并使用 参数(而不是 HRESULT)返回特定于函数调用的信息。

有关详细信息,请参阅以下主题:

接口定义和类型库