为什么IDL修改会导致C ++项目崩溃而VB项目不会崩溃?

时间:2014-04-11 01:29:58

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

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

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

为什么我们需要重建C ++项目但是VB项目没问题呢?

1 个答案:

答案 0 :(得分:5)

猜测,您可能只是在VB中将对象定义为Object s,如下所示:

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

如果是这样,你就迫使VB通过自动化界面(IDispatch)。基本上,它不知道在运行时将要分配给YourObject的类型,因此它必须通过IDispatch :: Invoke调用该对象上的方法。为此,它在运行时从对象本身查找调用所需的所有信息。

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

相关问题