我有一个问题,即何时需要使用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
}
// ...
}
答案 0 :(得分:4)
好吧,总是:)你需要它来获得对数组内容的引用。
但是你使用友好的C ++包装类。 CComSafeArray&lt;&gt;模板已经为你做了这个,所以你不应该帮忙。它在Attach()方法中使用SafeArrayLock(),它还返回一个指向数组内容的指针,如SafeArrayAccessData()。并使用其析构函数自动解锁,它在您的方法结束时运行。否则,锁定可确保阵列访问是线程安全的,并且在访问时无法删除。在您现有的代码中没有什么危险,但这完全符合自动化更安全而不是抱歉的原则。