c++ - 使用 C++Builder 后期绑定(bind) COM 对象

标签 c++ com c++builder late-binding

我们正在从 C++Builder 2010 应用程序连接到某些第 3 方 COM 对象。

目前我们导入类型库并生成组件包装器,然后能够以相当自然的方式进行方法调用和访问属性。

object->myProperty = 42;
object->doSomething(666);

然而,我们已经被 COM 对象接口(interface)(仍在扩展和开发中)的更改所困扰,导致我们自己的应用程序失败,因为某些方法 GUID 似乎已失效 - 即使对接口(interface)的唯一更改已经是添加了一种新方法)。

延迟绑定(bind)已被建议作为解决此问题的一种方式。我认为这需要更改我们的代码 rather like this:

object.OlePropertySet("myProperty", 42);
object.OlePrcedure("doSomething", 666);

显然,这读起来和写起来都很痛苦,所以我们不得不编写包装类。

有什么方法可以在我们导入类型库时自动生成后期绑定(bind)包装器吗?而且,如果是这样,它们是否足够聪明,只在创建对象时进行一次文本绑定(bind),而不是在每次方法调用时进行?

最佳答案

当您为支持后期绑定(bind)的 COM 对象导入 TypeLibrary 时(当它实现 IDispatch 接口(interface)时),导入器可以为静态绑定(bind)和后期绑定(bind)。

向现有接口(interface)添加新方法不应使您的代码无效。方法没有 GUID。但是,对于基于 IDispatch 的接口(interface),它的方法确实具有与之关联的 DISPID 值,并且这些 DISPID 值可以从一个版本中更改给另一个。尽管一旦接口(interface)定义被锁定,任何受人尊敬的 COM 开发人员都不应该这样做。

关于c++ - 使用 C++Builder 后期绑定(bind) COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11670175/

相关文章:

c++ - 请提出一些算法来找到树中所有节点中到最远节点的距离最小的节点

c++ - 打印双向链表 - 无结果

c++ - 使用 importlib 属性时的 MIDL2015 警告

C++ 从代码中编辑代码?

compiler-errors - 从 'double'转换为 'System::TVarRec'模棱两可

c++ - Libiconv C++ 生成器

c++ - 使用带有 soci::indicators [C++] 的 SOCI 从表中获取行

c++ - c++ 中二维 vector 的 cout 缺失行

vb.net - 使用 Office Interop 将单元格写入 Excel 的最快方法?

c++builder - 在 RAD Studio XE8 中编译时出现 "Unable to perform link"错误