2015-11-06 67 views
1

我有一个传统的COM组件,升级换代的一部分,我从现有的接口派生查询有关VB脚本和COM接口继承

接口1 { 一些方法 }

接口2:公共接口1 { 新方法 }

有一个旧的评论注释不要这样做。而是有inteface2有单独的一个不是从基地派生,因为它的一部分相同的CoClass ...没有必要重复任何代码...

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

任何人都可以解释...的一部分,他的意思是说的GetIDsOfNames将不能返回正确的ID?或者是别的东西

回答

1

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

因此,如果interface1最初是默认接口,那么脚本编程人员不能使用添加的interface2方法。你会想看看this SO post看到的后果。

您可以通过追加新方法来保持COM接口与旧客户端程序的向后兼容,并且永不改变旧方法的顺序或参数。这是很冒险的,一个意外遇到你的组件的旧版本的更新客户端程序将会以一种非常糟糕的方式出现。通常很难诊断,纯粹的DLL地狱。只有真正安全的方法是分配新的[uuid],强制客户端程序重新编译。如果您还更改了DLL的名称或安装位置,那么它们可以并排居住。