- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的情况是我有一个 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/
我有一个 Com 函数: GetData (SAFEARRAY ** pRetVal) 我有以下代码: SAFEARRAY *ppData = NULL; hr = pmyInterfac
我使用以下语句创建了包含 32 个元素的 CComSafeArray 对象。但经过一些操作后,我才知道我只需要安全数组中的 3 个元素。是否可以在创建安全数组后更改其中元素的数量? CComSafeA
我有一个 COM 函数: GetData(SAFEARRAY ** pRetVal) 和以下遗留代码: CComSafeArray saDataArray; hr = pmyInterface->Ge
我的情况是我有一个 COM 对象,我需要在 come windows 中仅使用 C++ 代码。 COM 对象具有接受 SAFEARRAY 作为参数以传递字节数组的函数。在查看了 SAFEARRAY A
CComSafeArray::SetAt method提供一个参数来控制引用的变量是否被复制: HRESULT SetAt( LONG lIndex, const T& t, BOOL bCopy =
我尝试了 GetSafeArrayPtr() 方法,该方法返回一个 LPSAFEARRAY*,typedef 定义为: typedef /* [wire_marshal] */ SAFEARRAY *
我有一个内存泄漏问题,我已将其缩小到以下代码。怎么回事? CComSafeArray sa(5); sa[0] = SysAllocString("constant"); CComSafeArray:
CComSafeArray arr; arr.Add(0x00); 错误 -> C2668:“ATL::CComSafeArray::Add”:对重载函数的调用不明确 我可以添加任何值但不能添加 0
我正在尝试 (i) 跨 COM 边界获取长整型安全数组,以及 (ii) 为方便起见使用 CComSafeArray。 我的问题是在设置 COM 属性后我遇到了不可预测的崩溃(参见下面的 pProlog
我有一个应该通过 LPSAFEARRAY* 返回 SafeArray 的 COM 函数出参数。该函数使用 ATL 的 CComSafeArray 创建 SafeArray模板类。我天真的实现使用 CC
这很可能有一个非常简单的答案,但我无法弄清楚。 我正在尝试重构一些如下所示的代码: SAFEARRAY* psa; long* count; HRESULT hr = pSomeInterface->
有什么快速的方法可以将 std::vector 转换为 CComSafeArray。我目前正在编写一段代码,基本上将 5 或 6 vector 转换为 CComSafeArray(不是在迭代中)。其中
我正在使用 ATL CComSafeArray类,但是如果数组为空,GetCount() 似乎会抛出异常,例如这段代码抛出异常: CComSafeArray array; // array.Add(i
在MSDN documentation for CComSafeArray::MultiDimSetAt , alIndex 记录如下: Pointer to a vector of indexes
我正在使用 COM 库“Microsoft 脚本运行时”(c:\windows\System32\scrrun.dll) 中的 Scripting.Dictionary。我正在使用 import 来获
CComSafeArray fields; hr = _tab_file->get_Fields(fields.GetSafeArrayPtr()); for ( LONG i = fields.Ge
我是一名优秀的程序员,十分优秀!