为什么IDL修改会在C++项目中导致崩溃,而在VB项目中却不会

Why IDL modification causes crash in C++ projects but not in VB projects?

本文关键字:项目 而在 VB 崩溃 C++ IDL 为什么 修改      更新时间:2023-10-16

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

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

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

猜测一下,您可能将VB中的对象定义为Objects,类似于以下内容:

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

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

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

相关文章: