不兼容更改的示例

处理不兼容的更改时,不幸的经验法则如下所示:任何更改都可以向后不兼容,除非理解得非常好。 此规则需要了解 NDR 规则。 如果不知道 NDR 是什么,请不要进行修改。 通常导致应用程序访问冲突或封送引擎引发的BAD_STUB_DATA_EXCEPTION更改的示例如下所示:

  • 在旧方法中间添加新方法。
  • 从方法添加或删除参数。
  • 更改属性,例如指针属性:将 [ref] 更改为 [unique] 或 [ptr],反之亦然。 每个指针类型具有不同的线表示形式。
  • 更改数据的大小:从短到长,从 char 更改为 wchar_t (unicode) ,向结构添加字段,更改固定大小数组的大小。
  • 使用默认子句将联合臂添加到联合。

客户端和服务器之间的某些隐性更改或意外不匹配可能如下所示:

  • 修改复合类型的成员,如结构或数组。 例如,如果CLIENT_ID从整型更改为 GUID,则具有CLIENT_ID字段的CLIENT_RECORD结构变得不兼容。 如果通过多个级别的嵌入到实际的远程参数类型进行级联,则可能很难检测这一点。
  • 修改导入的类型。 该类型可能来自不直接远程的其他组件,因此该更改被认为是兼容的。
  • 在 IDL 文件中使用#ifdef对 IDL 文件中的 ifdef 类型定义是一个坏主意, 这是等待发生的灾难。 不可避免的是,由于生成或其他故障,客户端使用与服务器不同的定义集进行编译,最终它们不兼容。