2

我有一个关于何时需要使用 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
    }
    // ...
}
4

1 回答 1

5

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

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

于 2013-06-21T11:47:16.423 回答