我们有一个C ++项目,它通过COM Automation公开一些类,因此有一个IDL
文件。
每当我们向IDL
中的类添加新函数(不更改UUID)时,需要使用新的{{1}重建使用类(但不是新函数)的其他C ++项目。或者它们会崩溃,但其他VB6 ActiveX项目不会崩溃。
为什么我们需要重建C ++项目但是VB项目没问题呢?
答案 0 :(得分:5)
猜测,您可能只是在VB中将对象定义为Object
s,如下所示:
Dim YourObject as Object
Set YourObject = CreateObject("YourComponent.YourObject")
如果是这样,你就迫使VB通过自动化界面(IDispatch)。基本上,它不知道在运行时将要分配给YourObject
的类型,因此它必须通过IDispatch :: Invoke调用该对象上的方法。为此,它在运行时从对象本身查找调用所需的所有信息。
相比之下,您的C ++代码可能是早期绑定的,这意味着COM对象的vtable中的偏移量会直接编译到您的代码中。在这种情况下,当/如果您更改代码以使这些偏移量无效时,代码将会失败。