接口设计规则

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

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

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

注意

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

 

其他接口设计注意事项

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

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

请小心为指针设置别名(允许指针指向同一内存块)。 如果别名是有意设计的,则应在 IDL 文件中声明这些指针的别名。 声明无别名的指针不应以彼此的别名命名。

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

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

有关详情,请参阅以下主题:

接口定义和类型库