c++ - COleSafeArray 与 CComSafeArray

标签 c++ windows com mfc

我的情况是我有一个 COM 对象,我需要在 come windows 中仅使用 C++ 代码。 COM 对象具有接受 SAFEARRAY 作为参数以传递字节数组的函数。在查看了 SAFEARRAY API ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms221145(v=vs.85).aspx ) 之后,我决定这不是我想要的,我应该找到一个面向对象的包装器。我试着寻找开源的,但没有找到。我发现微软创建了两个对象,好像封装了SAFEARRAY。看起来 CComSafeArray 正是我所需要的,而且 COleSafeArray 可能有用,但可能只是为了兼容旧版。

COleSafeArray 只是为了历史兼容性还是我遗漏了什么?

什么时候应该使用 COleSafeArray 而不是 CComSafeArray?

是否有任何值得研究的开源实现?

各自的优缺点是什么?

最佳答案

从类名上可以看出区别。

MFC COleSafeArray 旨在支持 OLE 自动化,实际上是 OLE VARIANT 结构(可以包含 SAFEARRAY)的包装器。它通常适用于数组元素,因为它们属于 VARIANT 类型,因此您需要手动选择和提取适当的类型。

ATL CComSafeArray 旨在支持通用 COM 的 SAFEARRAY,实际上是 SAFEARRAY 结构的包装器。它是用数组元素类型参数化的模板类。

一般来说,您应该使用 CComSafeArray,它更容易和更简单,访问元素的方式几乎与常规数组/vector 相同。

如果您使用大量使用 VARIANT 参数的 OLE 自动化接口(interface),例如

COleSafeArray 有时可能更可取自动化 MS Office,使用 Visual Basic 组件等。在这种情况下,为了与 CComSafeArray 进行比较,您需要手动将其包装/解包到 VARIANT 对象。

关于c++ - COleSafeArray 与 CComSafeArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13296910/

相关文章:

c++ - 为什么类型推导对我的集合交集和集合差异调用不起作用?

C++ Set 迭代器没有到达 Set 的末尾

c++ - 如何正确使用 std::functional 其他数据类型(在优先队列中)

c++ - 为什么以及何时使用多态性将基类指向 C++ 中的派生类

windows - Chef-Client 尝试在 Windows 上安装 Java,但它已经安装

c# - COM 方法、Char 类型和 CharSet

c++ - 如何在 C++ 中维护对 COM 对象的弱引用?

windows - 在 windows xp 上检索详细的 usb midi 设备信息

windows - 强制 Windows 在某些地方加载 DLL,以使内存碎片最少

c# - C++ DLL 在运行时抛出异常