为什么IDL修改会在C++项目中导致崩溃,而在VB项目中却不会
Why IDL modification causes crash in C++ projects but not in VB projects?
我们有一个C++项目,它通过COM Automation公开了一些类,因此有一个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的偏移量将直接编译到您的代码中。在这种情况下,当/如果您更改代码使这些偏移不再有效时,代码将严重失败。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 有没有办法使用输入的维度初始化 2d 数组中的所有项目而不循环C++?
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- CMake:Android Studio 原生活动项目无法在项目根目录之外找到第三方库
- 为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?
- 在for循环的某些迭代中,字符串的长度为0,而在其他迭代中则不为0
- 为什么带lcov的codecov在Travis上不能正常工作,而在我当地的Linux Mint上却不能正常工作
- 简单的cmake项目,在Windows上使用nmake构建没有调试符号
- 如何将图像文件夹添加到CMake项目以便在c ++可执行文件中使用这些图像?
- 为什么在一个地方需要双倍英镑,而在这个宏观上不需要其他地方?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 为什么 C++ 中的字符数组返回其项目而不是地址?
- 试图使循环仅检查字符串是否仅数字,而在编程中允许的C IM中允许的负数是一个类项目
- 导出visual studio c++项目以在另一个项目中使用,而不显示.cpp和.h源文件
- 一些C++代码在一个项目中出错,而在另一个项目中编译良好
- 从矢量中删除项目,而在 C++11 范围内'for'循环?
- 为什么IDL修改会在C++项目中导致崩溃,而在VB项目中却不会