【问题标题】:Why IDL modification causes crash in C++ projects but not in VB projects?为什么 IDL 修改会导致 C++ 项目崩溃,而 VB 项目不会?
【发布时间】:2014-05-24 23:34:20
【问题描述】:

我们有一个 C++ 项目,它通过 COM 自动化公开一些类,因此有一个 IDL 文件。

每当我们向 IDL 中的类添加新函数(不更改 UUID)时,其他使用这些类(但不是新函数)的 C++ 项目都需要使用新的 IDL 重新构建,否则它们会崩溃,但其他 VB6 ActiveX 项目不会崩溃。

为什么我们需要重新构建 C++ 项目而 VB 项目却可以?

【问题讨论】:

  • 您的 C++ 项目是否有机会直接使用这些 C++ 类(而不是通过 COM 接口工作)?展示一些代码,准确地演示您的 C++ 客户端如何获取服务器实例并在其上调用一个方法。

标签: c++ com vb6 idl com-automation


【解决方案1】:

猜测一下,您可能在 VB 中将对象定义为 Objects,如下所示:

Dim YourObject as Object
Set YourObject = CreateObject("YourComponent.YourObject")

如果是这样,您将强制 VB 通过自动化接口 (IDispatch)。基本上,直到运行时它才知道您要分配给YourObject 的类型,因此它必须通过IDispatch::Invoke 调用该对象上的方法。为此,它会在运行时从对象本身查找调用所需的所有信息。

相比之下,您的 C++ 代码可能是早期绑定的,这意味着 COM 对象的 vtable 中的偏移量会直接编译到您的代码中。在这种情况下,当/如果您更改代码以使这些偏移不再有效,则代码将严重失败。

【讨论】:

  • 如何使 C++ 项目的行为与 VB 类似?
  • 你也可以在 C++ 中使用call methods via IDispatch(虽然它相当痛苦和笨拙)。
  • @afriza:另一种选择是在每次修改 COM 服务器后重新编译 C++ 项目。
  • +1。 afriza,如果您提供了一些 Vb6 代码,那将会很有帮助。目前杰瑞正在猜测(虽然这是一个很好的猜测)。
猜你喜欢
  • 2014-06-18
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多