查询与VB脚本和COM接口继承有关

时间:2015-11-06 06:33:17

标签: c++ vbscript com atl

我有一个传统的COM组件,作为从现有界面派生的升级的一部分

接口1 {  几种方法 }

interface2:public interface1 { 新方法 }

有一个旧的评论评论不要这样做..以及inteface2有一个不是从基础派生的单独的,因为它是同一个CoClass的一部分......没有必要复制任何代码...

评论评论: 脚本语言是解释型语言,并且自然是多态的,因为所有方法都是后期绑定的。所有变量都是无类型的(VARIANT是无类型的)。 但是,脚本语言存在单独的问题。脚本语言不使用虚函数表来调用COM对象上的方法,而是通过IDispatch接口调用方法。不幸的是,IDispatch只能与一个自定义界面相关联。 通过IDispatch访问的所有方法都必须是自定义接口的一部分

任何人都可以解释......他的意思是说getidsofnames无法返回正确的ID吗?或者是别的什么

1 个答案:

答案 0 :(得分:1)

足够准确,一个coclass可以实现多个接口。但其中一个是“特殊的”,它是IDL中[default]所归属的那个。脚本语言只能使用该默认接口,它们没有检索另一个接口的机制。或者换句话说,他们不能调用QueryInterface()。主要是因为他们在语言设计中根本不支持接口或转换或多继承的概念。故意,脚本语言应该易于使用。

因此,如果interface1最初是默认接口,那么脚本编程程序永远不会使用添加的interface2方法。您需要查看this SO post以了解后果。

只需添加新方法并且永远不会更改旧方法的顺序或参数,就可以使COM接口向后兼容旧客户端程序。这是有风险的,一个更新的客户端程序,偶然遇到你的组件的旧版本将以一种非常糟糕的方式火上浇油。通常很难诊断,纯DLL地狱。只有真正安全的方法是分配新的[uuid],强制重新编译客户端程序。如果您还更改了DLL的名称或安装位置,那么它们可以并排存在。