更改现有接口

尽可能为应用程序实现新的接口,而不是对现有接口进行更改。 如果无法避免更改现有接口,请仅在新方法中使用新数据类型。 引入新数据类型或修改现有类型是不兼容问题的最常见根源。 RPC 运行时模型假定接收应用程序知道其接收的数据类型,因此数据将放在网络上,而无需一般数据说明。 当接收方期望的数据类型与发送方在网络上的数据类型不同时,存根会引发异常 (或传输失败,) 其他一些不太正常的方式。

RPC 接口由其 UUID 及其主版本号和次要版本号定义。 更改现有接口时,应在接口末尾添加新方法,并更改次要版本号。 如果在其他任何位置添加方法或对接口进行任何其他更改,则还需要更改主版本号。

实际上,有时甚至无法更改次要版本号,因为新客户端将无法与旧服务器通信,并且无法更新服务器。 当客户端调用的方法超出为其与服务器的接口指定的方法时,RPC 运行时会引发异常(RPC_S_PROCNUM_OUT_OF_RANGE)。 解决方法是保留版本号不变,并编写客户端代码以正常方式处理此异常,例如,客户端会降低其性能,或者通过任何适合应用程序的方式处理此异常。

在现有方法中更改数据类型这一特殊情况时,也有类似的解决方法。 如果联合的分支是指针,并且没有用于无法识别的类型默认分支,则可以添加使用新数据类型的新分支。 这不会更改数据结构的大小。 当客户端与新服务器通信时,它可以使用新的数据类型。 但是,当客户端与旧服务器通信时,运行时将引发异常RPC_S_INVALID_TAG。 同样,需要编写客户端代码才能正确处理此异常。

DCOM 接口由其 GUID 标识。 在 DCOM 中,接口被视为不可变的,只能通过创建继承自旧接口的新接口进行更改。 这些规则可确保客户端和服务器保持兼容。