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

Query related to VB script and COM interface inheritance

我有一个遗留的 COM 组件,作为升级的一部分,我从现有接口派生

接口1 { 几种方法 }

接口 2 :public 接口 1 { 新方法 }

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

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

任何人都可以解释一下...他的意思是说 getidsofnames 将无法 return 正确的 ID 吗?还是别的东西

说的很对,一个coclass可以实现多个接口。但是一个是"special",它是在IDL中被归因于[default]的那个。脚本语言只能使用该默认接口,它们没有检索另一个接口的机制。或者换句话说,他们不能调用 QueryInterface()。主要是因为他们在语言设计中根本不支持接口或转换或多重继承的概念。有意地,脚本语言应该易于使用。

因此,如果 interface1 最初是默认界面,那么脚本程序员永远无法使用添加的 interface2 方法。您需要查看 以了解结果。

您可以保持 COM 接口与旧客户端程序向后兼容,方法是只添加新方法而不更改旧方法的顺序或参数。这是有风险的,更新的客户端程序不小心遇到你的组件的旧版本会以非常糟糕的方式起火。通常很难诊断,纯 DLL 地狱。唯一真正安全的方法是分配新的 [uuid],强制重新编译客户端程序。如果您还更改了 DLL 的名称或安装位置,那么它们可以并存。