不兼容更改的示例

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

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

客户端和服务器之间的一些阴险更改或意外不匹配可能发生,如下所示:

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