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

Afr*_*ief 1 c++ vb6 com idl com-automation

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

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

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

Jer*_*fin 5

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

Dim YourObject as Object
Set YourObject = CreateObject("YourComponent.YourObject")
Run Code Online (Sandbox Code Playgroud)

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

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