何时使用SafeArrayAccessData锁定SAFEARRAY

时间:2013-06-21 06:40:47

标签: c++ com variant safearray

我有一个问题,即何时需要使用SafeArrayAccessData来锁定由托管代码传递的SAFEARRAY。 这是我们的代码。 VARIANT由托管代码传递,带有字符串数组。在代码审查期间,有人建议使用SafeArrayAccessData / SafeArrayUnAccessData。但他不确定为什么以及有什么好处。你能分享一下你的经历吗?谢谢!

STDMETHODIMP Base::Method1(VARIANT values, VARIANT_BOOL result)
{
    CComSafeArray<BSTR> ids;
    ids.Attach(values.parray);

    unsigned int size = ids.GetCount();
    for(unsigned int i = 0; i < size; ++i)
    {
    // use ids[i] here
    }
    // ...
}

1 个答案:

答案 0 :(得分:4)

好吧,总是:)你需要它来获得对数组内容的引用。

但是你使用友好的C ++包装类。 CComSafeArray&lt;&gt;模板已经为你做了这个,所以你不应该帮忙。它在Attach()方法中使用SafeArrayLock(),它还返回一个指向数组内容的指针,如SafeArrayAccessData()。并使用其析构函数自动解锁,它在您的方法结束时运行。否则,锁定可确保阵列访问是线程安全的,并且在访问时无法删除。在您现有的代码中没有什么危险,但这完全符合自动化更安全而不是抱歉的原则。