Когда использовать SafeArrayAccessData для блокировки 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
}
// ...
}

2

Решение

Ну, всегда 🙂 Вам нужно получить ссылку на содержимое массива.

Но вы используете дружественный класс оболочки C ++. CComSafeArray<> Шаблон уже делает это для вас, поэтому вы не должны помогать. Он использует SafeArrayLock () в методе Attach (), который также возвращает указатель на содержимое массива, как это делает SafeArrayAccessData (). И автоматически разблокируется деструктором, он запускается в конце вашего метода. В противном случае блокировка гарантирует, что доступ к массиву является потокобезопасным и не может быть удален при обращении к нему. В вашем существующем коде такой опасности мало, но это полностью соответствует принципам автоматизации «лучше, чем безопасно».

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]