如何通过 COM 发送列表
How to send list through COM
我可以通过COM发送对象列表吗?我有我的班级,还有一个这个班级的列表。我需要通过 COM 函数发送它。我能做到吗?如果是,那怎么做?是否需要序列化封送处理?
没有确定任何特定的集合类型,它当然没有任何对列表进行建模的标准。 按照约定,您可以使用接口对任何集合进行建模。 假设您有一个 Foo 对象的集合,每个对象都实现 IFoo。 然后声明一个类似于以下内容的 IEnumFoo 接口:
interface IEnumFoo : IUnknown
{
HRESULT Next( [in] ULONG celt,
[out, size_is(celt), length_is(*pceltFetched)] IFoo **rgelt,
[in,out,unique] ULONG *pceltFetched );
HRESULT Skip( [in] ULONG celt);
HRESULT Reset();
HRESULT Clone( [out] IEnumFoo **ppenum );
}
然后只需返回指向此接口实现的接口指针,以允许客户端代码枚举列表。 查看 MSDN 文档中的 IEnumVARIANT,这是一种非常常见的变体枚举接口类型。 这也解释了这些方法的作用。
如果界面的一端将使用具有"更简单"类型系统的语言编写,例如VB6或脚本,那么SAFEARRAY就是要走的路。 COM的通用编组可以照顾它。
如果接口的两端都有C++,并且很乐意在 IDL 中定义接口并生成自定义编组代码,则 IDL 包含可以使用的"size_is"属性。 详情请看这里。
在任何合理的程度上,没有办法使用 std::list 做到这一点。我敢肯定有一些疯子可以管理它,但根据我的经验,这不值得。如果不必是 std::list 而只是一些链表,那么您必须定义一个新的 COM 接口并提供它的实现(它可以只是 std::list 的包装器(,或者找到一些具有足够实现的第三方资源。如果你在实现 COM 接口方面没有太多经验,则需要大量阅读。
如果它可以是一个数组,那么通过使用 SAFEARRAY ,您可以使您的生活更简单。SAFEARRAYs可以更容易地与ATL的CComSafeArray一起使用,它几乎是一个包装器。它试图在处理 COM 对象时帮助您避免诸如引用计数之类的问题。然后,只需在 COM 对象之间传递数组。只是要提醒您,您仍然需要注意谁负责取消分配内存。
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 如何通过 COM 发送列表
- Visual C# - 引用 > 添加引用... > COM:该列表是如何填充的?
- MFC对话框菜单中可用com端口列表