Windows桌面应用程序(1-3-2-1st) 更改现有接口

尽可能为您的应用程序实现一个新界面,而不是对现有界面进行更改。如果无法避免更改现有接口,请仅在新方法中使用新数据类型。引入新数据类型或修改现有类型是不兼容问题的最常见来源。 RPC运行时模型假定接收应用程序知道它接收的数据类型,因此数据被放到线上而没有通用数据描述。当接收方期望的数据类型与发送方在线路上的数据类型不同时,存根会引发异常(或传输以其他一些不太优雅的方式失败)。

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

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

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

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


原文链接:Changing an Existing Interface

猜你喜欢

转载自blog.csdn.net/qq_37422196/article/details/81320810
今日推荐