0

我的情况是,我有一个 COM 对象,我需要在仅 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?

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

各自的优点和缺点是什么?

4

1 回答 1

1

从类名可以看出区别。

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

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

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

COleSafeArray如果您使用大量使用VARIANT参数的 OLE 自动化接口,例如自动化 MS Office、使用 Visual Basic 组件等,有时可能会更可取。为了在这种情况下与CComSafeArray您进行比较,您需要手动将其包装/解包到VARIANT对象。

于 2012-11-08T21:59:28.747 回答