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