【问题标题】:Query related to VB script and COM interface inheritanceVB脚本和COM接口继承相关的查询
【发布时间】:2016-02-07 05:56:04
【问题描述】:

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

接口1 { 几种方法 }

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

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

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

谁能解释...他的意思是说 getidsofnames 将无法返回正确的 ID 吗?还是别的什么

【问题讨论】:

    标签: c++ vbscript com atl


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-02
      • 2017-07-23
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多