1

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

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

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

4

1 回答 1

5

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

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

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

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

于 2014-04-11T01:58:12.613 回答