何时使用 SafeArrayAccessData 来锁定 SAFEARRAY

Arc*_*her 2 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
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 5

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

但是您使用了一个友好的 C++ 包装类。CComSafeArray<> 模板已经为你做了这件事,所以你不应该帮忙。它在 Attach() 方法中使用 SafeArrayLock(),它也像 SafeArrayAccessData() 一样返回指向数组内容的指针。并使用其析构函数自动解锁,它会在您的方法结束时运行。否则锁定可确保数组访问是线程安全的,并且在您访问它时不能被删除。在您现有的代码中几乎没有这种危险,但这完全符合自动化的安全胜于抱歉的原则。