c++ - VB脚本与COM接口(interface)继承相关的查询

标签 c++ vbscript com atl

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

界面1 { 几种方法

接口(interface)2:公共(public)接口(interface)1 { 新方法

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

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

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

最佳答案

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

因此,如果 interface1 最初是默认接口(interface),那么脚本程序员永远无法使用添加的 interface2 方法。你会想看看 this SO post看看后果。

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

关于c++ - VB脚本与COM接口(interface)继承相关的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33560815/

相关文章:

c++ - 在虚拟成员函数上使用模板的替代方法是什么?

c++ - 获取没有实例的 std::bitset 的大小

excel - 代码在 .vbs 文件中运行良好,但在 UFT 脚本中运行不佳 - 错误 429

用于访问 COM 对象属性的 C++ 包装函数(宏)

c++ - 从 vector 中删除最后一个元素直到条件

c++ - 帮助使用 boost relaxed heap

mysql - vbscript 中的安全 MySQL 查询

excel - 使用 SSIS 脚本任务刷新 Excel

c++ - COM:如何获取所有正在运行的对象

c++ - 在 Excel 自动化中使用非本地化公式